嵌套中继器 - 分组数据

问题描述 投票:2回答:1

我与ASP.NET开始,我想知道,如果在组显示从数据表中数据的任何“聪明”的方式? 想象一下下面的例子:我得到的数据,从SQL到数据表中分组和排序的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();
}

我想页面上显示它们象下面这样:

我试着使用嵌套中继器为:

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

}
asp.net .net repeater grouping
1个回答
0
投票

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

你需要第二个数据源添加到第二(嵌套)中继器。例如,返回实际的父的儿童的在所述第一数据源的功能。

Nested Repeaters in ASP.NET

© www.soinside.com 2019 - 2024. All rights reserved.