2010-04-08 129 views
0

示例代码嵌套DataPagers问题

<asp:Repeater> 

    <ItemTemplate> 

    <asp:ListView DataSource=<%# Container.DataItem.Items %> ... /> 

    <asp:DataPager .... /> 

    </ItemTemplate> 

</asp:Repeater> 

这是行不通的。

的转发器数据源不是数据源控制

它被设置像这样

repeater.DataSource =数据源
repeater.DataBind()

+0

您能否应用我给出的答案?任何结果? – 2010-04-27 00:24:29

+0

我已经用工作代码更新了我的答案。希望有所帮助。 – 2010-04-29 23:00:55

回答

0

这是可能的,我已经之前做过很多次了。

您可能必须自己连接事件,并且您必须在中继器项数据绑定事件中使用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>是无关紧要的,除了我需要在那里例子的目的分组数据在某种程度上是很重要的。你可以轻松地拥有OrderOrderDetail的典型示例,其中外部ListView是List<Order>,内部ListView是Order.OrderDetails

+0

我会试试看,并告诉你它是否有效,谢谢。 – Tomasi 2010-04-08 13:22:34

+0

不幸的是它不起作用。也许你可以给我一个工作样本? – Tomasi 2010-04-29 18:20:25