Поиск динамических элементов управления в других рядах повторителя - PullRequest
1 голос
/ 27 февраля 2012

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

Часть необходимой функциональности - возможность иметь динамически управляемые раскрывающиеся списки, которые зависят от значений из ранее выбранных раскрывающихся списков.для генерации их значений.

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

Это то, что я пытаюсь, но .FindControl каждый раз возвращает ноль.

DropDownList toParentDDL = (DropDownList)rptDynamicForm.FindControl("ParentControlID");

Идентификаторы устанавливаются правильно, а идентификатор являетсяв методе управления находкой тоже правильно.

Еще одна мысль ... Когда я добавляю элементы управления к повторителю, я делаю так:

e.Item.FindControl("pnlQuestionAnswer").Controls.Add(toDropDown);

Может ли быть так, что он находится внутри панели?

Чтобы убрать путаницу.Эти элементы управления создаются на ItemDataBound.

Решение:

Благодаря помощи Тима.Я наконец понял, в чем проблема.Я искал элемент управления внутри повторителя, а сам повторитель не содержит элемент управления, элементы содержат искомый элемент управления, и хотя элементы находятся в повторителе, он не выглядит в элементах.(У меня было в голове, что .findcontorl работает как .find в jquery, чего нет)

Исправить проблему, которую я просто сделал:

                    foreach (RepeaterItem toItem in rptDynamicForm.Items)
                    {
                        DropDownList toParentDDL = (DropDownList)toItem.FindControl("ParentControlID");

                        }

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

1 Ответ

3 голосов
/ 27 февраля 2012

Вы не можете найти повторитель, чтобы найти элемент управления в одном из его шаблонов элементов. Их NamingContainer являются их RepeaterItems , а не Repeater. Это имеет смысл, поскольку каждый элемент содержит элементы управления с тем же идентификатором, что и предыдущий / следующий элемент.

Поэтому вам нужно получить ссылку на предыдущий элемент, чтобы найти свой элемент управления:

protected void rptDynamicForm_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
   switch (e.Item.ItemType) {
       case ListItemType.Item:
       case ListItemType.AlternatingItem:
          if (e.Item.ItemIndex != 0) {
             DropDownList toParentDDL = 
                (DropDownList)rptDynamicForm.Items[e.Item.ItemIndex - 1].FindControl("ParentControlID");
          }
          break;
    }
}
...