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