Доступ к элементам управления, создаваемым динамически (c #) - PullRequest
4 голосов
/ 06 июня 2010

В моем коде позади (c #) я динамически создал несколько списков RadioButtonList с большим количеством RadioButton в каждом из них.Я поместил все элементы управления на определенную панель.Что мне нужно знать, так это как получить доступ к этим элементам управления позже, поскольку они не созданы в файле .aspx (с помощью перетаскивания из панели инструментов)?

Я пробовал это:

    foreach (Control child in panel.Controls)
    {
        Response.Write("test1");
        if (child.GetType().ToString().Equals("System.Web.UI.WebControls.RadioButtonList"))
        {
            RadioButtonList r = (RadioButtonList)child;
            Response.Write("test2");
        }   
    }

"test1 "и" test2 "не отображаются на моей странице.Это означает, что что-то не так с этой логикой.Любые предложения, что я мог сделать?

Ответы [ 3 ]

2 голосов
/ 06 июня 2010

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

ASP.NET не имеет состояния, то есть когда вы отправляете страницу обратно на сервер, ваши динамически созданные элементы управления больше не будут частью страницы.

На прошлой неделе мне пришлось снова преодолеть эту ситуацию.

Что я сделал? Я сохранил данные, которые я использовал для создания элементов управления внутри объекта Session. В методе PageLoad я передал те же данные для воссоздания динамических элементов управления.

Я предлагаю следующее: Напишите метод для создания динамических элементов управления.

В методе PageLoad проверьте, не является ли это обратной передачей ...

if(Page.IsPostBack)
{
   // Recreate your controls here.
}

Действительно важная вещь: назначьте уникальные идентификаторы своим динамически созданным элементам управления, чтобы ASP.NET мог воссоздать элементы управления, связывающие их существующие обработчики событий, восстановить их ViewState и т. Д.

myControl.ID = "myId";

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

Как говорил Фрэнк: вы можете использовать ключевое слово "is" таким образом, чтобы облегчить свою жизнь ...

if(child is RadioButtonList)


Примечание: Стоит упомянуть Обзор жизненного цикла страницы ASP.NET на MSDN для дальнейшего использования.

1 голос
/ 06 июня 2010

Когда вы делаете это в своем коде? Убедитесь, что вы делаете это в нужное время в жизненном цикле ASP, иначе ваши элементы управления еще не существуют:

0 голосов
/ 06 июня 2010

Я не думаю, что создание элементов управления в PageLoad - это сразу, сначала жизненный цикл asp.net начинается с инициализации, загрузки данных ViewState, загрузки PostData; Загрузка объекта и т. Д.

если вы создадите элементы управления в Page_Load, вы потеряете ViewState, события и т. Д.

Сразу же выполняется в PageInit, или если это элемент управления (OnInit).

Следующая трудность заключается в том, что в PageInit у вас нет ViewState Available, если вам нужно восстановить количество объектов, которые вам нужны, чтобы сохранить некоторый контекст / информацию в скрытом поле и затем извлечь эту информацию в PageInit, Create объекты и вуаля!

Пример:

представьте, что вам нужно создать 1..N TextBoxes, вы создаете скрытое поле html (не с runat = server), например. NumberOfTextBoxes.

Когда вы выполняете PageInit Code: вы получаете значение, например, numberOfTextBoxes = Request.Form ["NumberOfTextBoxes"], затем вы создаете текстовые поля.

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

...