Доступ к элементам управления RepeaterItem в EventHandler

2

У меня есть страница с ретранслятором. Я пишу обработчик событий, так что, когда пользователь нажимает на мою кнопку 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 и нажимаю кнопку, он возвращается обратно. На этом этапе повторитель снова привязывается к исходным значениям. Итак, если я должен отправить обратно, чтобы получить выбор пользователей, как я могу это сделать в обработчике событий кнопки, чтобы я мог получить выбранные значения до того, как повторитель снова получит привязку данных?

  • 0
    Где вы подключаете свой обработчик событий? Код, который вы разместили, должен быть в порядке - дело в том, что элементы не установлены.
  • 0
    Можете ли вы получить какую-либо информацию от отправителя объекта?
Показать ещё 4 комментария
Теги:

3 ответа

0
Лучший ответ

Вместо того, чтобы полагаться на IsPostBack в моем OnLoad, я просто разделил все разные состояния, поместив привязку репитера внутри обработчика события после того, как пользователь выберет первый вариант, вместо того, чтобы полагаться на IsPostBack OnLoad. Это было немного запутанно, но я думаю, что на этот раз я делаю это правильно.

3

Проблема, похоже, заключается в том, что вы можете привязывать данные к вашему ретранслятору при загрузке, но не сначала проверяете, чтобы убедиться, что это не сообщение.

Пример:

  • Вы запрашиваете страницу. При загрузке пожаров. Вы связываете данные с ретранслятором.
  • Вы перенастраиваете данные в адаптер, затем нажмите кнопку
  • Страница обновляется с помощью обратной передачи, запуская событие onload. Данные отскакивают до вашего ретранслятора, и все предыдущие введенные данные были аннулированы.
  • запускается событие onclick, и ваш код пытается получить значения, которые больше не существуют.

Убедитесь, что ваш код привязки данных в событии onLoad вложен в проверку после возврата.

if (!Page.IsPostBack)
{
   Repeater.DataSource = Datatable;
   Repeater.DataBind();
}
  • 0
    Я думаю, что это может быть проблема. Моя привязка данных происходит в if (Page.IsPostBack) {}. Когда страница не отправляется, я отображаю раскрывающийся список. Пользователь выбирает элемент, затем нажимает «Отправить», вызывая обратную передачу. Внутри обратной передачи у меня есть привязка к ретранслятору на основе выбора пользователей. Ретранслятор содержит элементы ввода, поэтому у меня есть кнопка asp: на нижнем колонтитуле, а в обработчике событий для этой кнопки я хочу использовать введенные значения из повторителя.
  • 0
    Проверяете ли вы, чтобы убедиться, что вы не пытаетесь получить доступ к верхнему или нижнему колонтитулам, когда вы просматриваете свои элементы. Проверьте свойство ItemType каждого элемента, чтобы убедиться, что это либо ListItem, либо AlternateItem, но не HeaderItem или FooterItem (в этом примере у меня могут быть немного отключены имена объектов. Подтвердите независимо.)
0

Я видел то же самое. Я не понимаю, почему, но данные на самом деле не связаны, пока все события не были запущены. Я закончил создание источника данных на уровне класса, а затем индексирование.

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? Конечно, нет, но он работает.

  • 0
    Я на самом деле просто получил это работает. Вместо того, чтобы полагаться на IsPostBack внутри OnLoad, я просто создал два отдельных обработчика событий для двух разных состояний, в которых будет находиться страница после выбора месяца.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню