Nested Repeaters in C#

前端 未结 4 2089
北荒
北荒 2020-12-30 17:05

Hi I have to display hierarchical information (which has four levels) within a repeater. For this I decided to use the nested repeater control. I found this article on MSDN

相关标签:
4条回答
  • 2020-12-30 17:15

    HTML CODE :

    <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# Code:

    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();
            }
    
        }
    }
    
    0 讨论(0)
  • 2020-12-30 17:26

    If you have Strongly Typed Data type, better to use ItemTypeproperty which is available in <asp:Repeater> control so that you can easily set the DataSource property of your nested <asp:Repeater> control to <%#Container.DataItem %> as follow same steps for each nested repeater.

    code sample:

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

    0 讨论(0)
  • 2020-12-30 17:32

    Building on the first answer, instead of building your table in the ItemDataBound function, you can pass in your table data on Page_Load, set it to a ViewState variable, then retrieve it when binding:

    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();
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-30 17:38

    There are plenty of examples available on internet. Following are some of that.

    http://www.codeproject.com/Tips/563919/Nested-Repeater-Controls-in-ASP-NET

    http://support.microsoft.com/kb/326338

    From below link you can download the code also. http://everymanprogrammer.com/index.php/nested-repeaters-do-it-clean-and-simple-a-beginners-tutorial-part-2/

    0 讨论(0)
提交回复
热议问题