Не удается добавить элементы управления на страницу динамически - PullRequest
2 голосов
/ 02 апреля 2009

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

while (dr.Read())
{
     ImageSelect imgSel = new ImageSelect(dr["Name"].ToString());
     myPanel.Controls.Add(imgSel);
}

Проблема в том, что на страницу не добавлены элементы управления, я проверяю вывод html и есть моя панель, в которой ничего нет.

Я даже прошел по коду в отладчике и убедился, что myPanel.Controls получает элемент управления, добавляемый в каждый цикл, с числом 6, без ошибок, но затем они не отображаются на странице.

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

EDIT: Итак, я переключился на использование LoadControl (".... ascx") для получения моего экземпляра элемента управления, который сейчас работает. Но изначально я также передавал данные через конструктор элементов управления. Это все еще возможно, или мне просто нужно установить их через get / sets?

РЕДАКТИРОВАТЬ 2: Спасибо Фредди за указание на то, что LoadControl перегружен, и вы МОЖЕТЕ передать параметры конструктора, см. Принятый ответ.

РЕДАКТИРОВАТЬ 3: После попытки этого метода как с, так и без конструктора. Я обнаружил, что лучше использовать сеттеры для любых свойств, которые я хочу, чтобы элемент управления имел по сравнению с попыткой использовать переданный объектный массив для моего конструктора.

Ответы [ 2 ]

4 голосов
/ 02 апреля 2009

Обновление: Как указал Стив, перегрузка LoadControl, которая использует тип, не будет учитывать элементы управления в ascx. Это также упоминается в этом ответе: Динамическая загрузка UserControl с методом LoadControl (Тип, объект []) .

Как я упоминал ранее, get / set больше соответствует модели asp.net, поэтому я рекомендую использовать ее с вариантом LoadControl, который получает путь элемента управления пользователя. Тем не менее, версия Стива - интересная альтернатива: http://www.grumpydev.com/2009/01/05/passing-parameters-using-loadcontrol/.

По моему мнению, LoadControl с типом предназначен для использования вместо пользовательских веб-элементов управления.


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

Вы можете использовать конструктор, выполнив:

var name = dr["Name"].ToString();
var imgSel = LoadControl(typeof(ImageSelect), new object[]{ name });
myPanel.Controls.Add(imgSel);

Обратите внимание, что в зависимости от используемой модели проекта вам необходимо добавить ссылку на aspx, чтобы использовать ее с вариантом typeof:

<%@ Reference Control="~/somepath/myusercontrol.ascx" %>

Ps. Я обычно использую set / get для элементов управления, так как нахожу их более подходящими для модели asp.net

3 голосов
/ 02 апреля 2009

Чтобы добавить UserControls, вы должны вызвать метод LoadControl, передав путь к файлу .ascx. Вы не можете создать их, просто создав экземпляр объекта, от которого наследуется файл .ascx.

UserControl состоит из разметки и класса в коде. Разметка содержит ссылку на класс позади, но класс позади не знает, где находится разметка и, следовательно, не может быть создан сам по себе.

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