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");
}
}
2条答案
按热度按时间ckocjqey1#
对于这个答案,我建议以编程方式创建模板-请参见此处:https://msdn.microsoft.com/en-us/library/aa289501。可能有一些方法可以使用在标记中创建的模板,但这似乎更容易,而且肯定更灵活。
我从一个只有一个中继器的页面开始(不是模板)
和数据类
对于模板,我们使用以下类:
很明显,你会想使用一个更复杂的模板。注意,如果你目前在标记中有一个模板,你可以简单地使用标记解析器生成的代码,并根据你的需要修改它。
现在,在页面的代码后面,我们简单地分配ItemTemplate和DataSource:
好的方面是你的模板只是一个类,所以你可以向它添加一个
public Int32 Depth { get; set; }
,并根据你的深度更改生成的控件。bf1o4zei2#
另一种解决方案(不以编程方式创建模板):
使用简单的数据类:
在ASPX标记中创建父重复器,将项显示代码放入ItemTemplate中,然后添加第二个“空”重复器:
在代码隐藏中: