我需要将转发器与分层数据绑定如下:
Category1
- Item1
- Item2
Category2
- Item3
- Item4
我目前只有一个包含项目的数据集以及每个项目所属的类别。
我正在努力学习Linq并想知道我是否有办法使用Linq做同样的事情?
以下是我的尝试:
var groupbyfilter = from dr in dtListing.AsEnumerable()
group dr by dr["Category"];
DataTable dtFinal = dtListing.Clone();
foreach (var x in groupbyfilter)
x.CopyToDataTable(dtFinal, LoadOption.OverwriteChanges);
rptList.DataSource = dtFinal;
rptList.DataBind();
但问题是它为每个项目重复了类别。
答案 0 :(得分:6)
你需要一个嵌套在另一个内的转发器。
在dtlisting
上选择仅显示类别字段。将它绑定到外部中继器。
在第二个转发器中,选择其条件具有类别字段的数据,该字段等于正在转发到转发器项目的值。您必须在转发器的onitem_databound
事件中处理此问题。
这是一个例子。
<%@ Import Namespace="System.Data" %>
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
<ItemTemplate>
<div>
Category: <b><%# Container.DataItem%></b>
<asp:Repeater ID="Repeater2" runat="server">
<FooterTemplate>
<%="</ul>" %>
</FooterTemplate>
<HeaderTemplate>
<%= "<ul>"%>
</HeaderTemplate>
<ItemTemplate>
<li>
<%# ((Data.DataRow)Container.DataItem)[1] %>, <%# ((Data.DataRow)Container.DataItem)[0] %>
</li>
</ItemTemplate>
</asp:Repeater>
</div>
</ItemTemplate>
</asp:Repeater>
对于此示例,我使用csv作为我的数据源,并使用它创建了一个数据表。所以我的代码隐藏看起来像:
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
public class _Default : System.Web.UI.Page
{
DataTable csvData;
protected void Page_Load(object sender, System.EventArgs e)
{
csvData = Utils.csvToDataTable("data.csv", true);
GridView1.DataSource = csvData;
GridView1.DataBind();
Repeater1.DataSource =
(from x in csvData.AsEnumerable() select x["category"]).Distinct();
Repeater1.DataBind();
}
protected void Repeater1_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item |
e.Item.ItemType == ListItemType.AlternatingItem) {
Repeater rptr = (Repeater)e.Item.FindControl("Repeater2");
rptr.DataSource =
csvData.AsEnumerable().Where(x => x["category"].Equals(e.Item.DataItem));
rptr.DataBind();
}
}
}
答案 1 :(得分:0)
你可以使用像deostroll这样的嵌套转发器,或指定一个分组字段,并在每次分组字段更改时动态隐藏(或渲染)的ItemTemplate中有一个组头。
的更多细节