0

我一直在使用中继器来绑定一个nested collection. 基本上我正在做的是,显示网页中的所有元素和值。

我的方法是使用嵌套中继器并在其中绑定a level below中继器数据源current ItemDataBount Event(请参阅下面的代码)

为每个项目创建控件并使用Eval.

考虑到这样一个事实DataSource is serializable,这是绑定嵌套集合的有效且最简单的方法吗?

<asp:Repeater ID="rpt1" OnItemDataBound="rpt1_ItemDataBound" runat="server">   
    <ItemTemplate>

        <asp:Label ID="lblSomeProperty" Text='<%#Eval("SomeProperty") %>' runat="server" />
        <%--few other controls--%>
        <asp:Repeater ID="rpt2"OnItemDataBound="rpt2_ItemDataBound" runat="server">
            <ItemTemplate>

            <asp:Label ID="Label1" Text='<%#Eval("SomeOtherProperty") %>' runat="server" />
                <asp:Repeater ID="rpt3" runat="server">
                    <ItemTemplate>
                    <asp:Label ID="Label1" Text='<%#Eval("SomeMoreProperty") %>' runat="server" />
                    </ItemTemplate>
                </asp:Repeater>

            </ItemTemplate>
        </asp:Repeater>

    </ItemTemplate>
</asp:Repeater>

代码隐藏:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        rpt1.DataSource = //RootElement IEnumerable
    }
}

protected void rpt1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    //proceed only if ItemTemplate OR AlternatingItemTemplate

    //populate user control values from DataItem in current context
    var rpt2 = e.Item.FindControl("rpt2") as Repeater;
    rpt2.DataSource = //Child Level1 IEnumerable
}

protected void rpt2_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    //bind rpt3 DataSource
}

感谢您的帮助。

4

2 回答 2

0

我想说你的实现是完全可行的,而且效率很高。这是处理您的方案的“.NET 方式”,使用中继器来显示模板化的信息集合,无论这是数据的主要集合还是子集合。

对于未来的开发人员来说,弄清楚发生了什么也很容易,而不是让事情变得过于复杂。无论如何,这就是我处理您的方案的方式,除非有任何进一步的业务需求涉及我扩展中继器控件并使用它。无需在不需要的情况下过度复杂化场景。

于 2012-10-23T13:50:12.363 回答
0

如果数据源是可序列化的,那么您绝对应该考虑使用ListViews (MSDN) 而不是中继器来显示您的数据。使用 ListViews,您可以以声明方式绑定数据源,而无需编写任何代码隐藏。您将能够有效地消除用于绑定每个中继器的所有 C# 代码。

请查看此StackOverflow 答案,以获取有关如何执行此操作的详细说明。

关键是在每个嵌套 ListView 内的标记中设置 DataSource

于 2012-10-23T14:16:26.690 回答