Загрузка вложенных UserControls в ASP.NET

У меня проблема с вложенными элементами управления, которые не загружаются должным образом. Я пробовал различные методы страниц, и ничего не работает.

EDIT: сайт компилируется и работает отлично – он просто оставляет пустой экран.

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

Обобщенные ответы были бы замечательными.

Вот что у меня есть. Я заменил свои пользовательские свойства / атрибуты наполнителями:

Default.aspx:

   

OuterUserControl.ascx:

   

OuterUserControl.ascx.cs:

 private member variables Att1 Att2 protected void Page_Load(object sender, EventArgs e) { for(int i=0;i<5;i++) { InnerUserControl cuc = new InnerUserControl(id); holder.Controls.Add(cuc); } } 

InnerUserControl.ascx:

   

InnerUserControl.ascx.cs:

 private int id; //private member variables public InnerUserControl(int id) { this.id = id; this.chart = new Chart(); } protected void Page_Load(object sender, EventArgs e) { //Get data for given id //Databind chart //etc.. } 

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

 protected void Page_Load(object sender, EventArgs e) { for(int i=0;i<5;i++) { InnerUserControl cuc = (InnerUserControl)this.Page.LoadControl("InnerUserControl.ascx"); holder.Controls.Add(cuc); } } 

Предполагая, что они находятся в одном каталоге. Если нет, поместите виртуальный путь в качестве параметра в метод LoadControl. Когда вы это сделаете, вам не нужно иметь инструкцию регистрации на внешнем элементе управления. Кроме того, я обычно использую на фронте кода вместо тега div. Однако я не уверен, что это имеет значение. Я бы также рекомендовал загрузить элемент управления OnInit, так как это обеспечит выполнение всех этапов цикла Lifecycle для ваших пользовательских элементов управления.

Удачи!

Вы пробовали добавить

 < %@ Reference Control="InnerUserControl.ascx" %> 

к OuterUserControl.ascx

Я бы порекомендовал другой подход. Вместо создания экземпляра объекта управления в коде и добавления его в коллекцию элементов управления (что, я думаю, вам, вероятно, понадобится LoadControl () для правильной работы и сделать это раньше, чем page_load, чтобы подключить его к жизненному циклу страницы), добавьте внутреннее управление декларативно в OuterUserControl.

Если вам нужно добавить InnerUserControl 5 раз (например, пример), объявите InnerUseControl внутри ретранслятора. Это связано со списком идентификаторов.

 < %@ Control Language="C#" AutoEventWireup="true" CodeBehind="OuterUserControl.ascx.cs" Inherits="Proj.OuterUserControl" EnableViewState="false" %> < %@ Register src="InnerUserControl.ascx" tagname="InnerUserControl" tagprefix="uc1" %>