2009-07-08 77 views
0

我遇到了一個嵌套控件無法正確加載的問題。我試過各種頁面方法,似乎沒有任何工作。在ASP.NET中加載嵌套的UserControls

編輯:網站編譯和運行良好 - 它只是留下一個空白屏幕。

基本上我有一個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

您是否嘗試過加入

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

到OuterUserControl.ascx

+0

謝謝,是的,我有。 – Chet 2009-07-08 18:11:07

+0

然後在OuterUserControl.ascx中試試這個<%@ Reference Control =「InnerUserControl.ascx」%> – Slim 2009-07-08 21:02:57

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> 
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,因爲這將確保生命週期的所有階段都針對您的用戶控件運行。

祝你好運!