【问题标题】:Nested Repeaters in C#C# 中的嵌套中继器
【发布时间】:2013-07-01 06:07:15
【问题描述】:

您好,我必须在转发器中显示分层信息(有四个级别)。为此,我决定使用嵌套中继器控件。 我在 MSDN 上找到了这篇文章,http://support.microsoft.com/kb/306154,它展示了如何使用嵌套中继器获取两个级别的信息。 有人可以帮我将其扩展到四个级别吗? 一个示例代码将非常有用。谢谢你。

【问题讨论】:

    标签: asp.net c#-4.0 repeater


    【解决方案1】:

    HTML 代码:

    <asp:Repeater ID="Repeater1" runat="server" 
            onitemdatabound="Repeater1_ItemDataBound">
            <ItemTemplate>
                <h1>
                    Repeater 1</h1>
                <asp:Repeater ID="Repeater2" runat="server" onitemdatabound="Repeater2_ItemDataBound">
                    <ItemTemplate>
                        <h1>
                            Repeater 2
                        </h1>
                        <asp:Repeater ID="Repeater3" runat="server" onitemdatabound="Repeater3_ItemDataBound">
                            <ItemTemplate>
                                <h1>
                                    Repeater 3
                                </h1>
                                <asp:Repeater ID="Repeater4" runat="server" onitemdatabound="Repeater4_ItemDataBound">
                                    <ItemTemplate>
                                        <h1>
                                            Repeater 4
                                        </h1>
                                    </ItemTemplate>
                                </asp:Repeater>
                            </ItemTemplate>
                        </asp:Repeater>
                    </ItemTemplate>
                </asp:Repeater>
            </ItemTemplate>
        </asp:Repeater>
    

    C#代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data;
    
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            DataTable dt1 = new DataTable();
            //Need to assign the Data in datatable
            Repeater1.DataSource = dt1;
            Repeater1.DataBind();
    
        }
        protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                Repeater Repeater2 = (Repeater)(e.Item.FindControl("Repeater2"));
    
                DataTable dt2 = new DataTable();
                //Need to assign the Data in datatable
                Repeater2.DataSource = dt2;
                Repeater2.DataBind();
            }
    
        }
        protected void Repeater2_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                Repeater Repeater3 = (Repeater)(e.Item.FindControl("Repeater3"));
    
                DataTable dt3 = new DataTable();
                //Need to assign the Data in datatable
                Repeater3.DataSource = dt3;
                Repeater3.DataBind();
            }
    
        }
    
        protected void Repeater3_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                Repeater Repeater4 = (Repeater)(e.Item.FindControl("Repeater4"));
    
                DataTable dt4 = new DataTable();
                //Need to assign the Data in datatable
                Repeater4.DataSource = dt4;
                Repeater4.DataBind();
            }
    
        }
    }
    

    【讨论】:

    • 我有四个表,其中包含使用中继器填​​充所需的数据。 (R1-T1、R2-T2、R3-T3、R4-T4)。 T1,T2,T3,T4 都使用具有 1:M 关系的外键连接。因此,一旦填充了父中继器,我如何将特定父级的详细信息提取到子中继器。请帮忙。谢谢 :) @Deepak.Aggrawal
    • 您可以通过 DataBinder.Eval(e.Item.DataItem,"T1") 获取 DataBound 中的 Id,并根据您的父 ID 过滤您的结果。
    • 嵌套中继器(子中继器)应仅显示与其父中继器相关的详细信息。我怎样才能做到这一点?你能详细说明你所说的吗?谢谢你。 @Deepak.Aggrawal
    【解决方案2】:
    【解决方案3】:

    在第一个答案的基础上,您可以在 Page_Load 上传入表数据,而不是在 ItemDataBound 函数中构建表,将其设置为 ViewState 变量,然后在绑定时检索它:

    private DataTable GetCachedDataTable(string strTable)
    {
        DataTable dtableCached = (DataTable)this.ViewState[strTableCache];
        return dtableCached;
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            this.ViewState["TblTwo_Cache"] = null;
            DataTable tblOne = new DataTable();
            DataTable tblTwo = new DataTable();
            myFunctionReturningTwoTables(ref tblOne, ref tblTwo);
    
            // Bind the first one
            if (tblOne != null)
            {
                // This first line assumes an <asp:Panel ID=pnlMain runat=server> 
                // tag is added in front of the Repeater1 tag in the ASPX markup, above,
                // and an </asp:Panel> tag is after the last </asp:Repeater> tag
                Repeater rptr = pnlMain.FindControl("Repeater1") as Repeater;
                rptr.ItemDataBound += new RepeaterItemEventHandler(rptrItemDataBound);
                rptr.DataSource = tblOne;
                rptr.DataBind();
            }
            // Cache the 2nd (and others...) like this
            if (tblTwo != null)
            {
                this.ViewState["TblTwo_Cache"] = tblTwo;
            }
        }
    }
    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            Repeater rptr2 = e.Item.FindControl("Repeater2") as Repeater;
            if (rptr2 != null)
            {
                DataTable dt = new DataTable();
                // Now, pull it out of cache
                dt = GetCachedDataTable("TblTwo_Cache");
                if (dt != null)
                {
                    rptr2.DataSource = dt;
                    rptr2.DataBind();
                }
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      如果您有强类型数据类型,最好使用&lt;asp:Repeater&gt; 控件中提供的ItemTypeproperty,以便您可以轻松地将嵌套&lt;asp:Repeater&gt; 控件的DataSource 属性设置为&lt;%#Container.DataItem %&gt;,如下所示每个嵌套中继器的步骤相同。

      代码示例:

      <asp:Repeater ID="associatedDataRepeater" runat="server">
        <ItemTemplate>
      
          <asp:Repeater runat="server" DataSource='<%#Container.DataItem %>'>
            <ItemTemplate>
      
            </ItemTemplate>
          </asp:Repeater>
      
        </ItemTemplate>
      </asp:Repeater>

      【讨论】:

        猜你喜欢
        • 2010-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-24
        相关资源
        最近更新 更多