Средства управления, добавленные в разработчике, являются пустыми во время Page_Load

Все имена ниже универсальны а не используемые подлинные имена.

У меня есть пользовательский UserControl с Панелью, которая содержит пару Маркировок, оба средства управления .aspx.

.aspx:


    
    


    
    

Codebehind:

private readonly Object object;
protected void Page_Load(object sender, EventArgs e)
{
    // These are the lines that are failing
    // label1 and label2 are null
    label1.Text = object.Value1;
    label2.Text = object.Value2;
}
public ObjectRow(Object objectToDisplay)
{
    object = objectToDisplay;
}

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

protected void Page_Load(object sender, EventArgs e)
{
    Usercontrol control = new UserControl(object);
    Controls.Add(control);
}

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

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

Действительно ли это - проблема жизненного цикла ASP.net, которую я не понимаю? Мое понимание на основе страницы жизненного цикла Microsoft ASP.net было то, что средства управления страницей были доступны после Page_Initialization.

Что надлежащий путь состоит в том, чтобы сделать это? Существует ли лучший путь?

Править: От ниже я попытался использовать Page. LoadControl.

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

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

Править: По-видимому, перегруженный метод, не инстанцирующий дочерних элементов управления, прибавил .ascx файл, "дизайном". Я нашел это в комментариях на уровне страницы Microsoft для Page. LoadControl (тип, объект [])

9
задан mwright 24 March 2010 в 18:39
поделиться

2 ответа

Когда вы создаете экземпляр кода за классом пользовательского элемента управления, вы не создаете экземпляр пользовательского элемента управления. Фактический пользовательский элемент управления - это класс, который создается из разметки в файле .ascx, и этот класс наследуется от кода, стоящего за классом.

Если вы хотите создавать пользовательские элементы управления динамически, используйте метод Page.LoadControl . Он создаст экземпляр пользовательского элемента управления, в котором код, стоящий за ссылками на элементы управления, соответствует элементам управления, созданным из разметки:

CustomControl control = (CustomControl)Page.LoadControl("controls/CustomControl.ascx");

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

CustomControl control = (CustomControl)Page.LoadControl(typeof(CustomControl), new object[] { objectToDisplay } );

(Я не уверен, каким должен быть параметр типа. По логике, это должен быть тип страницы .ascx, а не тип кода, стоящего за классом.)

{{1 }}
12
ответ дан 4 December 2019 в 09:36
поделиться

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

Когда / где вы добавляете настраиваемый элемент управления в коллекцию Controls?

0
ответ дан 4 December 2019 в 09:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: