У меня есть страница с ретранслятором. Я пишу обработчик событий, так что, когда пользователь нажимает на мою кнопку WebControl, обработчик события для указанной кнопки выполняет итерацию через элементы ретранслятора с помощью FindControl, затем использует некоторые из значений элементов управления. Кажется, что после загрузки страницы элементы повторителя заполняются, но когда кнопка нажата, чтобы отправить ее обратно, когда я повторяю элементы ретранслятора, я вижу, что они все пусты. Я не совсем понимаю последовательность, но я предполагаю, что мой код итерации пытается получить доступ к RepeaterItems, которые еще не установлены.
Код ретранслятора находится в моем методе OnLoad. Кроме того, у меня есть обработчик событий, пытающийся выполнить итерацию этих элементов после нажатия. Это по существу то, что я пытался сделать:
protected void MyButton_Click(object sender, EventArgs e)
{
foreach(RepeaterItem item in MyRepeater.Items)
{
MyLabel = (Label)item.FindControl("MyLabel");
}
}
Кнопка находится в FooterTemplate ретранслятора.
<asp:Button runat="server" OnClick="SubmitChecklist_Click" cssclass="BlueSubmit" id="SubmitChecklist" text="Submit" />
Спасибо заранее.
Изменить: Чтобы уточнить, точная ошибка, которую я получаю, это NullReferenceException, когда я пытаюсь что-то сделать, например Response.Write(MyLabel.Text)
Изменить: просмотрев его сегодня, это то, что, как я понимаю, происходит: ретранслятор представляет собой привязку данных для обратной передачи. Когда я делаю выбор из сгенерированных dropdownlists и нажимаю кнопку, он возвращается обратно. На этом этапе повторитель снова привязывается к исходным значениям. Итак, если я должен отправить обратно, чтобы получить выбор пользователей, как я могу это сделать в обработчике событий кнопки, чтобы я мог получить выбранные значения до того, как повторитель снова получит привязку данных?
Вместо того, чтобы полагаться на IsPostBack в моем OnLoad, я просто разделил все разные состояния, поместив привязку репитера внутри обработчика события после того, как пользователь выберет первый вариант, вместо того, чтобы полагаться на IsPostBack OnLoad. Это было немного запутанно, но я думаю, что на этот раз я делаю это правильно.
Проблема, похоже, заключается в том, что вы можете привязывать данные к вашему ретранслятору при загрузке, но не сначала проверяете, чтобы убедиться, что это не сообщение.
Пример:
Убедитесь, что ваш код привязки данных в событии onLoad вложен в проверку после возврата.
if (!Page.IsPostBack)
{
Repeater.DataSource = Datatable;
Repeater.DataBind();
}
Я видел то же самое. Я не понимаю, почему, но данные на самом деле не связаны, пока все события не были запущены. Я закончил создание источника данных на уровне класса, а затем индексирование.
private DataTable myTable;
protected void Page_Load(object sender, EventArgs e)
{
//populate dataTable
if (!IsPostBack)
{
//databind to repeater
}
}
protected void Submit_Click(object sender, EventArgs e)
{
foreach (RepeaterItem item in repeater1.Items)
{
DataRow row = myTable.Rows[item.ItemIndex];
}
}
Ideal? Конечно, нет, но он работает.