这是可能的,我已经之前做过很多次了。
您可能必须自己连接事件,并且您必须在中继器项数据绑定事件中使用FindControl()
以获取特定的ListView以设置数据源,并且还要在其上调用DataBind。
您可以在嵌套的Repeater/DataList中使用数据绑定快捷键<%# ... %>
,但不能像您那样设置数据源。
将以下内容粘贴到空白的新项目中。编译并运行。
(大免责声明 - 在HTML仅仅是示范,是非常不好的。)
的Web表单代码。
<asp:ListView ID="dlOuter" runat="server"
onitemdatabound="dlOuter_ItemDataBound">
<LayoutTemplate>
<div id="personGroupList">
<asp:PlaceHolder ID="itemPlaceHolder" runat="server" />
</div>
</LayoutTemplate>
<ItemTemplate>
<div class="groupHeading"><%# Eval("Key") %></div>
<asp:ListView ID="dlInner" runat="server"
ItemPlaceholderID="innerItemPlaceHolder"
onitemdatabound="dlInner_ItemDataBound"
>
<LayoutTemplate>
<asp:PlaceHolder ID="innerItemPlaceHolder" runat="server" />
</LayoutTemplate>
<ItemTemplate>
<div class="person">
Name: <%# Eval("Name") %>
Age: <%# Eval("Age") %>
</div>
</ItemTemplate>
</asp:ListView>
</ItemTemplate>
</asp:ListView>
代码
现在落后
protected void Page_Load(object sender, EventArgs e)
{
// takes a list of Person and group's by Person.City
// really this is just an outer grouping that's in use.
var query = from p in Person.GetPersons() select p;
dlOuter.DataSource = query.ToLookup(o => o.City);
dlOuter.DataBind();
}
// The outer List View is the groups.
// we bind the inner view to the list if Person in the group.
protected void dlOuter_ItemDataBound(object sender, ListViewItemEventArgs e)
{
if (e.Item.ItemType == ListViewItemType.DataItem)
{
ListViewDataItem di = (ListViewDataItem)e.Item;
ListView inner = (ListView)e.Item.FindControl("dlInner");
IGrouping<string, Person> lookup = (IGrouping<string, Person>)di.DataItem;
inner.DataSource = lookup.AsEnumerable();
inner.DataBind();
}
}
protected void dlInner_ItemDataBound(object sender, ListViewItemEventArgs e)
{
// included so you can see how it's wired up. Unused in this sample.
}
Person类是只是为了演示。
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string City { get; set; }
public static List<Person> GetPersons()
{
List<Person> persons = new List<Person>
{
new Person { Name="Bob", Age=30, City="Chicago" },
new Person { Name="Mary", Age=20, City="NYC" },
new Person { Name="Marty", Age=12, City="LA" },
new Person { Name="Fred", Age=33, City="NYC" },
new Person { Name="Susan", Age=22, City="Chicago" }
};
return persons;
}
}
请注意,在此示例中,我使用ToLookup进行分组以创建列表中的分组。在实际的代码中,它是从一个特定的日子里发生的事情来显示一个数据页面。例如。该记录由thing.SomeDate
排序,分组是query.ToLookup(o => o.SomeDate.ToLongDateString());
需要注意的是ToLookup
和使用IGrouping<T,X>
是无关紧要的,除了我需要在那里例子的目的分组数据在某种程度上是很重要的。你可以轻松地拥有Order
和OrderDetail
的典型示例,其中外部ListView是List<Order>
,内部ListView是Order.OrderDetails
您能否应用我给出的答案?任何结果? – 2010-04-27 00:24:29
我已经用工作代码更新了我的答案。希望有所帮助。 – 2010-04-29 23:00:55