Не удается добавить элементы управления на страницу динамически
Я добавляю пользовательский элемент управления для каждой записи, извлеченной в считывателе данных, вот основной цикл:
while (dr.Read())
{
ImageSelect imgSel = new ImageSelect(dr["Name"].ToString());
myPanel.Controls.Add(imgSel);
}
Проблема в том, что на страницу не добавлены элементы управления, я проверяю вывод html и есть моя панель, в которой ничего нет.
Я даже прошел по коду в отладчике и убедился, что myPanel.Controls получает элемент управления, добавляемый в каждый цикл, с числом 6, без ошибок, но затем они не отображаются на странице.
Я запустил приведенный выше код в событиях Page_Init и Page_Load, оба с одинаковым результатом.
РЕДАКТИРОВАТЬ: Хорошо, поэтому я переключился на использование LoadControl("....ascx"), чтобы получить мой экземпляр управления, который сейчас работает. Но изначально я также передавал данные через конструктор элементов управления. Это все еще возможно, или мне просто нужно установить их через get/sets?
РЕДАКТИРОВАТЬ 2: Спасибо Фредди за указание на то, что LoadControl имеет перегрузку, когда вы МОЖЕТЕ передать параметры конструктора, см. Принятый ответ.
РЕДАКТИРОВАТЬ 3: после попытки этого метода как с, так и без конструктора. Я обнаружил, что лучше использовать сеттеры для любых свойств, которые я хочу, чтобы элемент управления имел, вместо того, чтобы пытаться использовать переданный объектный массив для моего конструктора.
2 ответа
Обновление: как указал Стив, перегрузка LoadControl, которая использует тип, не будет учитывать элементы управления в ascx. Это также упоминается в этом ответе: динамическая загрузка UserControl с помощью метода LoadControl (Type, object []).
Как я упоминал ранее, 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
Чтобы добавить UserControls, вы должны вызвать метод LoadControl, передав путь к файлу.ascx. Вы не можете создать их, просто создав экземпляр объекта, от которого наследуется файл.ascx.
UserControl состоит из разметки и класса в коде. Разметка содержит ссылку на класс позади, но класс позади не знает, где находится разметка и, следовательно, не может быть создан сам по себе.