嵌套中继器 - 分组数据

时间:2012-11-02 13:57:41

标签: asp.net .net repeater grouping

我是从ASP.NET开始的,我想知道,如果有任何“智能”的方式来显示DataTable中的数据吗?
想象一下以下示例:我从SQL获取数据到datatable分组和排序alredy:

protected void Page_Load(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("parent", typeof(string));
    dt.Columns.Add("child", typeof(string));
    dt.Rows.Add("AAA", "111");
    dt.Rows.Add("AAA", "222");
    dt.Rows.Add("AAA", "333");
    dt.Rows.Add("BBB", "444");
    dt.Rows.Add("BBB", "555");
    dt.Rows.Add("CCC", "666");
    dt.Rows.Add("CCC", "777");
    dt.Rows.Add("CCC", "888");

    repeaterParent.DataSource = dt;
    repeaterParent.DataBind();
}

我希望在页面上显示它们,如下所示:
enter image description here

我尝试使用嵌套转发器:

<asp:Repeater ID="repeaterParent" runat="server">
    <ItemTemplate>
        <b><%# DataBinder.Eval(Container.DataItem, "parent") %></b>
        <br /> 
        <asp:repeater id="repeaterChild" runat="server">
            <itemtemplate>
                    - <%# DataBinder.Eval(Container.DataItem, "child") %> <br />
            </itemtemplate>
        </asp:repeater>
    </ItemTemplate>
</asp:Repeater>

当然它不起作用 - 结果如下 - 它既没有分组,也没有显示儿童:
enter image description here

如何完成 - 控件不必是转发器 - 它可以是listview,项目符号列表或类似的东西。

最好,如果有一些“智能”的方式 - 所以我只是将datatable绑定到datasource,然后控件为我做了其余的(分组)。我宁愿避免将数据源表拆分为两个不同的源,或者为每个父项进行SQL查询并使用ItemDataBound事件 - 只要它是可能的。如果没有 - 你能告诉我任何这样做的方法吗? .NET版本:4.0

最好的问候,
马尔钦

- 编辑:
我找到了以下解决方案,但是,我并不喜欢它,因为每个项目都有昂贵的过滤源表,我不确定它对大型源数据表的表现如何。我很乐意听到是否有更好的解决方案:

protected void repeaterParent_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    DataRowView drv = (DataRowView)e.Item.DataItem;
    string parent = drv["parent"].ToString();

    dt.DefaultView.RowFilter = string.Format("[parent]='{0}'", parent);
    DataTable dtChild =  dt.DefaultView.ToTable(true, "child");

    Repeater repeaterChild = (Repeater)e.Item.FindControl("repeaterChild");
    repeaterChild.DataSource = dtChild;
    repeaterChild.DataBind();

}

1 个答案:

答案 0 :(得分:0)

您走在正确的轨道上,但是您只有一个数据源,这是第一个转发器的输入。

您需要向第二个(嵌套)转发器添加第二个数据源。例如,一个返回第一个数据源中实际父项的子项的函数。

Nested Repeaters in ASP.NET