Все имена ниже универсальны а не используемые подлинные имена.
У меня есть пользовательский 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 (тип, объект [])
Когда вы создаете экземпляр кода за классом пользовательского элемента управления, вы не создаете экземпляр пользовательского элемента управления. Фактический пользовательский элемент управления - это класс, который создается из разметки в файле .ascx, и этот класс наследуется от кода, стоящего за классом.
Если вы хотите создавать пользовательские элементы управления динамически, используйте метод Page.LoadControl
. Он создаст экземпляр пользовательского элемента управления, в котором код, стоящий за ссылками на элементы управления, соответствует элементам управления, созданным из разметки:
CustomControl control = (CustomControl)Page.LoadControl("controls/CustomControl.ascx");
Но это не дает вам возможности отправлять параметры в конструктор, поэтому вы можете использовать перегрузку который принимает тип:
CustomControl control = (CustomControl)Page.LoadControl(typeof(CustomControl), new object[] { objectToDisplay } );
(Я не уверен, каким должен быть параметр типа. По логике, это должен быть тип страницы .ascx, а не тип кода, стоящего за классом.)
{{1 }}Вы можете попробовать вызвать EnsureChildControls в обработчике Page_Load настраиваемого элемента управления, хотя, AFAIK, в этом нет строгой необходимости.
Когда / где вы добавляете настраиваемый элемент управления в коллекцию Controls?