簡體   English   中英

在ASP.NET中加載嵌套的UserControl

[英]Loading Nested UserControls in ASP.NET

我遇到了嵌套控件無法正確加載的問題。 我嘗試了各種頁面方法,但似乎沒有任何效果。

編輯:該站點可以編譯並正常運行-盡管它只是一個空白屏幕。

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

當您從后面的代碼中添加用戶控件時,您實際上必須加載該控件。 您可以通過執行以下操作來做到這一點:

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語句。 另外,我通常在代碼前面使用,而不是div標簽。 但是,我不確定這是否有所作為。 我還將建議加載控件OnInit,因為這將確保為用戶控件運行生命周期的所有階段。

祝好運!

您是否嘗試過添加

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

到OuterUserControl.ascx

我建議使用其他方法。 與其在后台代碼中實例化控件對象並將其添加到控件集合中(我認為您可能需要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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM