2012-10-23 45 views
0

我一直在使用中繼器被綁定一個nested collection綁定序列化的數據結構。基本上我正在做的是在WebPage中顯示所有元素&值。是直放站有效

我的方法是,使用嵌套的中繼器和current ItemDataBount Event結合a level below轉發數據源(請參見下面的代碼)

這是一個很大的副本&粘貼任務的創建控件每個&每一個項目,並綁定該數據使用Eval

考慮到事實DataSource is serializable,這是有效的&綁定嵌套集合的最簡單方法?

<asp:Repeater ID="rpt1" OnItemDataBound="rpt1_ItemDataBound" runat="server"> 
    <ItemTemplate> 

     <asp:Label ID="lblSomeProperty" Text='<%#Eval("SomeProperty") %>' runat="server" /> 
     <%--few other controls--%> 
     <asp:Repeater ID="rpt2"OnItemDataBound="rpt2_ItemDataBound" runat="server"> 
      <ItemTemplate> 

      <asp:Label ID="Label1" Text='<%#Eval("SomeOtherProperty") %>' runat="server" /> 
       <asp:Repeater ID="rpt3" runat="server"> 
        <ItemTemplate> 
        <asp:Label ID="Label1" Text='<%#Eval("SomeMoreProperty") %>' runat="server" /> 
        </ItemTemplate> 
       </asp:Repeater> 

      </ItemTemplate> 
     </asp:Repeater> 

    </ItemTemplate> 
</asp:Repeater> 

代碼隱藏:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     rpt1.DataSource = //RootElement IEnumerable 
    } 
} 

protected void rpt1_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    //proceed only if ItemTemplate OR AlternatingItemTemplate 

    //populate user control values from DataItem in current context 
    var rpt2 = e.Item.FindControl("rpt2") as Repeater; 
    rpt2.DataSource = //Child Level1 IEnumerable 
} 

protected void rpt2_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    //bind rpt3 DataSource 
} 

謝謝您的幫助。

回答

0

如果數據源是可序列化,那麼你絕對應該考慮使用ListViews(MSDN),而不是中繼器來顯示數據。使用ListViews,你可以聲明性地綁定數據源,而不需要編寫任何代碼隱藏。你將能夠有效地消除你用來綁定每個中繼器的所有C#代碼。

看看這個StackOverflow answer有關如何做到這一點的詳細說明。

關鍵是將數據源設置在每個嵌套ListView中的標記中

0

我說你的實現是完全可行的,以及作爲有效。這是接近您的方案的「.NET方式」,使用Repeater顯示模板化的信息集合,無論它是主數據還是次數據集合。

很容易找出未來開發者的情況,而不是過於複雜的事情。無論如何,這是我的方式,除非有任何進一步的業務需求涉及我擴展Repeater控件並使用它。在沒有必要的情況下,無需過度複雜化。