示例代码
<asp:Repeater>
<ItemTemplate>
<asp:ListView DataSource=<%# Container.DataItem.Items %> ... />
<asp:DataPager .... />
</ItemTemplate>
</asp:Repeater>
这不起作用。
转发器数据源不是数据源控件
设置如此
repeater.DataSource = datasource
repeater.DataBind()
答案 0 :(得分:0)
这是可能的,我以前做了很多次。
您可能必须自己连接事件,并且必须在repeater项目数据绑定事件中使用FindControl()
来获取特定的ListView以设置数据源,并在其上调用DataBind
您可以在嵌套的Repeater / DataList中使用数据绑定快捷方式<%# ... %>
,但不能像您一样设置DataSource。
将以下内容粘贴到空白的新项目中。编译并运行。
(大免责声明 - html仅用于演示并且很差。)
网络表单代码。
<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 class仅用于演示。
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