2015-03-31 37 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后面的代码

现在根据您的深度生成控件。