【问题标题】:Nested repeaters - grouping data嵌套中继器 - 分组数据
【发布时间】:2012-11-02 13:57:41
【问题描述】:

我从 ASP.NET 开始,我想知道,是否有任何“智能”方式来分组显示 DataTable 中的数据?
想象一下下面的例子:我从 SQL 获取数据到数据表中已经分组和排序:

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();
}

我想在如下页面上显示它们:

我已尝试为此使用嵌套中继器:

<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>

当然它不起作用 - 结果如下 - 它既没有分组也没有显示子项:

如何实现 - 控件不必是中继器 - 它可以是列表视图、项目符号列表或类似的东西。

最好,如果有一些“智能”方式 - 所以我只需将数据表绑定到数据源,然后控件为我完成其余部分(分组)。我宁愿避免将数据源表拆分为两个不同的源或对每个父项进行 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();

}

【问题讨论】:

  • 我只需手动从 DataTable 中创建一个包含子对象的对象列表,然后将其绑定到嵌套的中继器中。会有开销,但比过滤每个元素要少。

标签: asp.net .net repeater grouping


【解决方案1】:

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

您需要将第二个数据源添加到第二个(嵌套)中继器。例如,返回第一个数据源中实际父级的子级的函数。

Nested Repeaters in ASP.NET

【讨论】:

  • 谢谢你的回答,我以前看过那个帖子,但是,我不明白你建议的链接中的 ColOfCol 是什么意思。此外,它不会按照我需要的方式对数据进行分组,对吗?
猜你喜欢
  • 1970-01-01
  • 2015-02-10
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多