Загрузка вложенных пользовательских элементов управления в 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..
}
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. Вам не нужно иметь оператор регистра на внешнем контроле, когда вы делаете это. Кроме того, я обычно использую в начале кода вместо тега div. Я не уверен, если это имеет значение, как бы то ни было. Я бы также рекомендовал загрузить элемент управления OnInit, поскольку это обеспечит выполнение всех этапов жизненного цикла для ваших пользовательских элементов управления.
Удачи!
Вы пытались добавить
<%@ 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" %>
<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>