Не удается добавить элементы управления на страницу динамически

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

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 состоит из разметки и класса в коде. Разметка содержит ссылку на класс позади, но класс позади не знает, где находится разметка и, следовательно, не может быть создан сам по себе.

Другие вопросы по тегам