0

我遇到了嵌套控件无法正确加载的问题。我尝试了各种页面方法,但似乎没有任何效果。

编辑:该站点编译并运行良好-尽管它只是留下一个空白屏幕。

基本上我有一个图表的包装控件,它允许我选择数据、绑定和自定义具有大量抽象的图表。我需要另一个包装器控件,因为可能有我想轻松表示的图表组。

笼统的答案也会很棒。

这就是我所拥有的。我已经用填充物替换了我的自定义属性/属性:

默认.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" />

外部用户控件.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);
 }
}

内部用户控制.ascx:

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

内部用户控制.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..
}
4

3 回答 3

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,因为这将确保为您的用户控件运行生命周期的所有阶段。

祝你好运!

于 2009-07-29T16:46:17.057 回答
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>
于 2009-07-15T03:58:48.853 回答
0

您是否尝试过添加

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

到 OuterUserControl.ascx

于 2009-07-08T18:01:41.197 回答