Метод с использованием Handles MyBase.Load Я пытаюсь заполнить раскрывающийся список всем временем суток с интервалом в 30 минут, вместо того, чтобы жестко его кодировать, я создал цикл, который создает и добавляет в раскрывающиеся списки . Я застрял на том, как сделать так, чтобы он запускался только один раз при первой загрузке страницы.
Единственное, что я нашел в других сообщениях, это сделать так, чтобы оно запускало событие. Я видел, как люди предлагали добавить Handles MyBase.Load, но это также добавляет дубликаты в существующие раскрывающиеся списки, когда другая часть страницы публикует ответ.
Вместо этого я хочу, чтобы он просто создавал и добавлял элементы списка один раз при первой загрузке страницы, любая помощь будет оценена по достоинству. Спасибо.
Page.IsPostBack будет иметь значение true, когда кто-то отправит страницу. Проверить это можно в методе Load/Page_Load. Загрузка страницы будет срабатывать каждый раз, когда запрашивается страница.
Если вы хотите загружать данные только раз в 30 минут, добавьте пару свойств и определите их как «Общие». Один для DateTime для записи времени загрузки данных, а второй для хранения данных.
Значение в общих или статических свойствах доступно для всех сеансов, и, добавив код при загрузке страницы, который проверяет DateTime и, если он слишком старый, затем обновляет общее свойство, вы можете добиться того, что вы описываете.
Ну, конечно, нет смысла пытаться загружать такие данные при первом запуске всего веб-сайта.
Что касается простой обратной публикации на странице?
Последние 200+ веб-страниц, которые я создал, ВСЕ ИМЕЮТ стандартную заглушку кода IsPostBack в событии загрузки страницы. Фактически, вы даже не сможете создать работающую веб-страницу, если не примете использование такой заглушки кода.
Помните, что в отличие от настольного компьютера, при любом ответном сообщении, при любом нажатии кнопки сначала каждый раз запускается событие загрузки страницы, а ЗАТЕМ срабатывает ваш код заглушки для кнопки.
К счастью, у нас есть флаг IsPostBack, который позволяет проверить, действительно ли это первая загрузка страницы.
Итак, скажем, мне нужно в раскрывающемся списке выбрать время начала и окончания сегодняшнего дня, и, следовательно, у нас может быть такая разметка:
<div style = "float: left">
<h4>Select Start Time</h4>
<asp:DropDownList ID = "cboStart" runat = "server"
DataValueField = "Date"
DataTextField = "TimeDisplay">
</asp:DropDownList>
</div>
<div style = "float: left;margin-left:35px">
<h4>Select End Time</h4>
<asp:DropDownList ID = "cboEnd" runat = "server"
DataValueField = "Date"
DataTextField = "TimeDisplay">
</asp:DropDownList>
</div>
<div style = "clear:both"></div>
<br />
<asp:Button ID = "cmdShow" runat = "server" Text = "Show Selected time"
CssClass = "btn"
OnClick = "cmdShow_Click"/>
<br />
<br />
<asp:Label ID = "lblShowSelected" runat = "server" Text = "">
</asp:Label>
А для простоты кодирования на дисплее будет отображаться только время, но выбор значений будет включать дату + время, и это, конечно, делает код менее сложным, поскольку мы всегда имеем дело с допустимой датой и временем, и, таким образом, выбор может быть например, используется для базы данных.
И код такой:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
LoadCbo
End If
End Sub
Sub LoadCbo()
Dim dtTimes As New DataTable
dtTimes.Columns.Add("Date", GetType(DateTime))
dtTimes.Columns.Add("TimeDisplay", GetType(String))
Dim dtStartDay = Date.Today
Dim dtStartTime = TimeSerial(9, 0, 0) ' start at 9 am
Do
Dim NewRow = dtTimes.NewRow()
NewRow("Date") = dtStartDay.Add(dtStartTime.TimeOfDay)
NewRow("TimeDisplay") = dtStartTime.ToString("hh:mm tt")
dtTimes.Rows.Add(NewRow)
dtStartTime = dtStartTime.AddMinutes(30)
Loop While Hour(dtStartTime) <= 17 ' go untill 5 pm
cboStart.DataSource = dtTimes
cboStart.DataBind()
cboStart.Items.Insert(0, "Select start Time")
cboEnd.DataSource = dtTimes
cboEnd.DataBind()
cboEnd.Items.Insert(0, "Select End Time")
End Sub
Protected Sub cmdShow_Click(sender As Object, e As EventArgs)
Dim dtStart As DateTime = cboStart.SelectedItem.Value
Dim dtEnd As DateTime = cboEnd.SelectedItem.Value
Dim sMsg As String =
$"Selected Time for {dtStart.ToString("dddd MMMM dd, yyyy")} Is <br/>
{dtStart.ToString("hh:mm tt")} to {dtEnd.ToString("hh:mm tt")}"
lblShowSelected.Text = sMsg
End Sub
Выше мы загружаем поля со списком с шагом в 30 минут, но вы можете изменить это на все, что пожелаете.
Обратите внимание на важный тест IsPostBack. Это означает, что код настройки для загрузки элементов управления и общий код настройки страницы запускаются только один раз при первой реальной загрузке страницы. Хотя для каждого нажатия кнопки и т. д. (обратная связь) сначала запускается событие загрузки страницы, а затем ваш код заглушки нажатия кнопки?
Это не имеет значения, поскольку наш «настоящий» код загрузки первой страницы находится внутри нашего теста IsPostBack и, следовательно, будет запускаться только один раз при первой загрузке страницы.
Результат вышеизложенного таков:
Следовательно, теперь мы можем иметь события нажатия кнопок и т. д., и поэтому они не будут влиять на код, который загружает элементы управления, такие как DropDownList (поле со списком) в этом примере.
Вы просто ищете
If Not IsPostBack
в обработчике событий загрузки страницы?