2015-03-31 61 views
1

我想在asp.net中使用中繼器控件實現n級數據層次結構。 是否有任何解決方案來實現該層次?如何在asp.net中實現N級嵌套Repeater控件?

+1

簡答:是的。較長的回答:是的,但我們更願意看看你到目前爲止已經嘗試過什麼,以及在哪裏無法正常工作 – freefaller 2015-03-31 09:01:03

+0

我有一個包含另一箇中繼器控制的中繼器控件,另一個包含具有另一箇中繼器控件的用戶控件。我想使用該用戶控件繼續該層次到n級。 – 2015-03-31 09:03:51

+0

您是否想要實現一個嵌套式中繼器,並根據需要表示您的數據 - 基本上是一個遞歸模板? 你想渲染某種樹視圖嗎? – 2015-03-31 09:05:39

回答

1

對於這個答案,我將建議以編程方式創建您的模板 - 請參閱:https://msdn.microsoft.com/en-us/library/aa289501。 可能有一些方法可以使用標記中創建的模板,但這看起來更容易,而且更靈活。

我開始了一個頁面只是一箇中繼器(不是模板)

<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:Repeater runat="server" ID="TestRepeater"> 
     </asp:Repeater> 
    </div> 
    </form>  
</body> 

和數據類

public class DataClass 
{ 
    public string Name { get; set; } 
    public List<DataClass> Children { get; set; } 
} 

對於我們用下面的類模板:

public class DataTemplate : ITemplate 
{ 
    public void InstantiateIn(Control container) 
    { 
     var name = new Literal(); 
     var repeater = new Repeater(); 

     name.DataBinding += BindingLiteral; 
     repeater.DataBinding += BindingRepeater; 

     // this here makes it recursive 
     repeater.ItemTemplate = new DataTemplate(); 

     container.Controls.Add(name); 
     container.Controls.Add(repeater); 
    } 

    private void BindingLiteral(object sender, System.EventArgs e) 
    { 
     var name = (Literal)sender; 
     var container = (RepeaterItem)name.NamingContainer; 
     name.Text = String.Concat("<h2>", DataBinder.Eval(container.DataItem, "Name").ToString(), "</h2>"); 
    } 

    private void BindingRepeater(object sender, System.EventArgs e) 
    { 
     var name = (Repeater)sender; 
     var container = (RepeaterItem)name.NamingContainer; 
     name.DataSource = DataBinder.Eval(container.DataItem, "Children"); 
    } 
} 

顯然你會想要使用更復雜的模板。請注意,如果您目前在標記中使用了模板,那麼您可以簡單地獲取標記解析器生成的代碼,並根據需要進行調整。

public partial class Test : System.Web.UI.Page 
{ 
    protected void Page_Init(object sender, EventArgs e) 
    { 
     TestRepeater.DataSource = GetTestData(); 
     TestRepeater.ItemTemplate = new DataTemplate(); 
     TestRepeater.DataBind(); 
    } 
} 

這個好處是你的模板就是一個類,所以你可以添加一個public Int32 Depth { get; set; }給它,並改變:

頁面,我們簡單的分配ItemTemplate中和DataSource後面的代碼

現在根據您的深度生成控件。