【问题标题】:Nested DataPagers problem嵌套 DataPagers 问题
【发布时间】:2010-04-08 01:08:34
【问题描述】:

示例代码

<asp:Repeater>

  <ItemTemplate>

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

    <asp:DataPager .... />

  </ItemTemplate>

</asp:Repeater>

这不起作用。

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

是这样设置的

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

【问题讨论】:

  • 你能应用我给出的答案吗?有结果吗?
  • 我已经用工作代码更新了我的答案。希望对您有所帮助。

标签: asp.net controls webforms


【解决方案1】:

这是可能的,我以前做过很多次。

您可能必须自己连接事件,并且您必须在转发器项数据绑定事件中使用FindControl() 来获取特定的 ListView 以设置数据源,并在其上调用 DataBind。

您可以在嵌套的Repeater / DataList 中使用数据绑定快捷方式&lt;%# ... %&gt;,但不能像您所做的那样设置DataSource。


将以下内容粘贴到一个空白的新项目中。编译并运行。

(大免责声明 - 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 =&gt; o.SomeDate.ToLongDateString() );

重要的是要注意ToLookupIGrouping&lt;T,X&gt; 的使用是无关紧要的,除非出于示例的目的,我需要以某种方式在其中获取分组数据。您可以很容易地获得OrderOrderDetail 的规范示例,其中外部ListView 是List&lt;Order&gt;,内部ListView 是Order.OrderDetails

【讨论】:

  • 不幸的是它不起作用。也许你可以给我一个工作样本?
猜你喜欢
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2018-02-20
  • 1970-01-01
  • 2013-08-04
  • 2021-07-10
相关资源
最近更新 更多