1
我想在asp.net中使用中繼器控件實現n級數據層次結構。 是否有任何解決方案來實現該層次?如何在asp.net中實現N級嵌套Repeater控件?
我想在asp.net中使用中繼器控件實現n級數據層次結構。 是否有任何解決方案來實現該層次?如何在asp.net中實現N級嵌套Repeater控件?
對於這個答案,我將建議以編程方式創建您的模板 - 請參閱: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; }
給它,並改變:
現在根據您的深度生成控件。
簡答:是的。較長的回答:是的,但我們更願意看看你到目前爲止已經嘗試過什麼,以及在哪裏無法正常工作 – freefaller 2015-03-31 09:01:03
我有一個包含另一箇中繼器控制的中繼器控件,另一個包含具有另一箇中繼器控件的用戶控件。我想使用該用戶控件繼續該層次到n級。 – 2015-03-31 09:03:51
您是否想要實現一個嵌套式中繼器,並根據需要表示您的數據 - 基本上是一個遞歸模板? 你想渲染某種樹視圖嗎? – 2015-03-31 09:05:39