在ASP.NET中加载嵌套的UserControl

时间:2009-07-08 17:55:16

标签: c# .net asp.net user-controls page-lifecycle

我遇到嵌套控件无法正确加载的问题。我尝试了各种页面方法,似乎没什么用。

编辑:网站编译并运行良好 - 但它只是留下了一个空白屏幕。

基本上我有一个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..
}

3 个答案:

答案 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>