Загрузка вложенных пользовательских элементов управления в ASP.NET

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

РЕДАКТИРОВАТЬ: сайт компилируется и работает нормально, хотя он просто оставляет пустой экран.

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

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

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

Default.aspx:

<%@ Page Language="C#" CodeBehind="Default.aspx.cs" %>
<%@ Register src="OuterUserControl.ascx" tagname="OuterUserControl" tagprefix="uc2" %>
<uc2:OuterUserControl ID="uc1" runat="server" Att1="foo" Att2="bar" />

OuterUserControl.ascx:

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

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:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="InnerUserControl.ascx.cs" Inherits="Proj.InnerUserControl" %>
<asp:Chart ID="chart" runat="server"></asp:Chart>

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..
}

person Chet    schedule 08.07.2009    source источник


Ответы (3)


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

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. При этом вам не нужно иметь оператор register во внешнем элементе управления. Кроме того, я обычно использую в коде вместо тега div. Однако я не уверен, что это имеет значение. Я бы также рекомендовал загрузить элемент управления OnInit, так как это обеспечит выполнение всех этапов жизненного цикла для ваших пользовательских элементов управления.

Удачи!

person Nutzy    schedule 29.07.2009
comment
Я не могу получить доступ к своему пользовательскому элементу управления в методе Page_Load другого пользовательского элемента управления. Как указать виртуальный путь в качестве параметра метода LoadControl? - person ShaileshDev; 12.04.2017

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

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

в OuterUserControl.ascx

person Slim    schedule 08.07.2009
comment
Затем попробуйте это ‹%@ Reference Control=InnerUserControl.ascx %› в OuterUserControl.ascx - person Slim; 09.07.2009
comment
@Slim, Спасибо, но у меня есть «Ссылка» и «Регистрация» во всех элементах управления и страницах ... тот же результат белой страницы. - person Chet; 09.07.2009

Я бы рекомендовал другой подход. Вместо того, чтобы создавать экземпляр объекта управления в коде программной части и добавлять его в коллекцию элементов управления (что, я думаю, вам, вероятно, понадобится 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" %>
       <asp:Repeater ID="Repeater1" runat="server" DataSourceID="src">
    <ItemTemplate>
      <uc1:InnerUserControl id="iuc" runat="server" ID='<%#Eval("ID")%>'/>
    </ItemTemplate>
    </asp:Repeater>

    <asp:ObjectDataSource ID="src" runat="server" SelectMethod="IDList" 
        TypeName="Web.Default"></asp:ObjectDataSource>
person JNappi    schedule 15.07.2009