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