2013-07-01 2 views
4

안녕하세요, 리피터 내에 계층 적 정보 (네 가지 수준 있음)를 표시해야합니다. 이를 위해 중첩 된 리피터 컨트롤을 사용하기로 결정했습니다. MSDN에서이 기사를 찾았습니다. http://support.microsoft.com/kb/306154 중첩 된 중계기를 사용하여 두 가지 수준의 정보를 얻는 방법을 보여줍니다. 누군가 이것을 4 단계로 확장시킬 수 있습니까? 샘플 코드가 훨씬 유용합니다. 고맙습니다.C#의 중첩 된 리피터

답변

15

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# 코드 : 대신하여 ItemDataBound 기능에 테이블을 구축하는 첫 번째 대답에

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

제가 중계기를 사용되기까지 필요한 데이터를 갖는 네 개의 테이블을 갖는다. (R1-T1, R2-T2, R3-T3, R4-T4). T1, T2, T3, T4는 모두 1 : M 관계의 외래 키를 사용하여 연결됩니다. 따라서 일단 부모 리피터가 채워지면 어떻게 그 특정 부모의 세부 정보를 자식 리피터로 추출 할 수 있습니까? 도와주세요. 감사합니다 :) @ Deepak.Aggrawal –

+0

DataBinder.Eval (e.Item.DataItem, "T1")에 의해 DataBound에서 ID를 가져올 수 있으며 상위 ID를 기반으로 결과를 필터링 할 수 있습니다. –

+0

중첩 된 중계기 (하위 중계기)는 상위 중계기와 관련된 세부 정보 만 표시해야합니다. 내가 어떻게 그걸 성취 할 수 있니? 네가 한 말을 더 자세히 설명해 주시겠습니까? 고맙습니다. @ Deepak.Aggrawal –

0

건물, 당신은에 전달할 수 있습니다 Page_Load의 테이블 데이터를 ViewState 변수로 설정 한 다음 바인딩 할 때 검색 :

0 쉽게 <%#Container.DataItem %>에 중첩 <asp:Repeater> 제어의 DataSource 속성을 설정할 수 있도록 각 중첩 된 리피터 같은 단계를 수행으로
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

당신이 강하게 데이터 형식을 입력 한 경우, 더 나은 <asp:Repeater> 컨트롤에서 사용할 수 ItemType 속성을 사용합니다.

코드 샘플 :

<asp:Repeater ID="associatedDataRepeater" runat="server"> 
 
    <ItemTemplate> 
 

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

 
     </ItemTemplate> 
 
    </asp:Repeater> 
 

 
    </ItemTemplate> 
 
</asp:Repeater>