我遇到嵌套控件无法正确加载的问题。我尝试了各种页面方法,似乎没什么用。
编辑:网站编译并运行良好 - 但它只是留下了一个空白屏幕。基本上我有一个Chart的包装器控件,它允许我选择数据,绑定和自定义图表的大量抽象。我需要另一个包装器控件,因为可能有一组我想要表示的图表。
广义的回答也很棒。
这就是我所拥有的。我用填充符替换了我的自定义属性/属性:
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..
}
答案 0 :(得分: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语句。另外,我通常在代码前端使用an而不是div标签。但是,我不确定这是否有所作为。我还建议加载控件OnInit,因为这将确保为用户控件运行生命周期的所有阶段。
祝你好运!答案 1 :(得分:0)
您是否尝试过添加
<%@ Reference Control="InnerUserControl.ascx" %>
到OuterUserControl.ascx
答案 2 :(得分:0)
我建议采用不同的方法。而不是在代码隐藏中实例化控件对象并将其添加到控件集合(我认为您可能需要LoadControl()正确执行并且比page_load更早地将其挂接到页面生命周期中),添加内部控件在OuterUserControl中以声明方式进行。
如果需要添加InnerUserControl 5次(如示例),请在转发器中声明InnerUseControl。这与id的列表绑定。
<%@ 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>