嵌套的DataPagers问题

时间:2010-04-08 01:08:35

标签: asp.net controls webforms

示例代码

<asp:Repeater>

  <ItemTemplate>

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

    <asp:DataPager .... />

  </ItemTemplate>

</asp:Repeater>

这不起作用。

转发器数据源不是数据源控件

设置如此

repeater.DataSource = datasource
repeater.DataBind()

1 个答案:

答案 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() );

重要的是要注意ToLookupIGrouping<T,X>的使用是无关紧要的,除非我需要以某种方式为了示例的目的而在那里获得分组数据。您可以轻松拥有OrderOrderDetail的规范示例,其中外部ListView是List<Order>,内部ListView是Order.OrderDetails