【问题标题】:ListView with DataPager not working带有 DataPager 的 ListView 不起作用
【发布时间】:2008-10-24 16:35:46
【问题描述】:

从我读过的所有内容来看,似乎将分页添加到 ListView 控件应该非常简单,但它对我不起作用。在将 ListView 和 DataPager 控件添加到表单并将它们连接在一起之后,我的行为变得非常奇怪。 DataPager 正确地限制了 ListView 的页面大小,但单击分页按钮根本不会影响 ListView。分页按钮似乎认为他们正在做他们的工作,因为当您转到最后一页等时,最后一个按钮被禁用,但 ListView 永远不会改变。此外,需要在 DataPager 上单击两次才能使其执行任何操作,即单击 Last 一次不会执行任何操作,但再次单击它会使 DataPager 做出反应,就像现在选择了最后一页一样。

我唯一能想到的是,我在运行时将 DataSource 绑定(到 LINQ 对象),而不是使用 LinqDataSource 控件或任何东西。有没有人见过这种行为?难道我做错了什么?这是我正在使用的代码:

<asp:DataPager ID="HistoryDataPager" runat="server" PagedControlID="HistoryListView" PageSize="10">
    <Fields>
        <asp:NextPreviousPagerField ButtonType="Button" ShowFirstPageButton="true" ShowLastPageButton="true" />
    </Fields>
</asp:DataPager>

<asp:ListView ID="HistoryListView" runat="server">
    ...
</asp:ListView>

在代码隐藏中:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        HistoryListView.DataSource = From x in myContext.myTables ...
        DataBind()
    End If

End Sub

【问题讨论】:

    标签: asp.net vb.net listview paging


    【解决方案1】:

    我们需要在 OnPreRender 事件中再次绑定列表视图。

    protected override void OnPreRender(EventArgs e)
            {
                ListView1.DataBind();
                base.OnPreRender(e);
            }
    

    --更新

    在使用 asp.net ajax 处理了一些列表视图之后,我看到了一个比上述解决方案更有意义的解决方案。您通常会在页面加载方法或按钮单击事件处理程序上对 Listview 进行数据绑定,并且当有回发时,数据绑定将丢失,如问题中所述。因此,我们需要在列表视图的页面属性更改事件处理程序上再次进行数据绑定。

    ListView_PagePropertiesChanged(object sender, EventArgs e)
    {
    ListView.DataSource=someDatasource;
    ListView.DataBind()
    }
    

    【讨论】:

    • 您不需要再次进行DataBind。但是,是的,您可以通过预渲染中的数据绑定来解决此问题。
    • 这是我在 ASP.net 上见过的最愚蠢的事情(尽管我确信还有更糟的情况)。但是谢谢你找到它。我从没想过会有 pre_render 错误。
    • @Syam 当我使用预渲染覆盖时,listView 数据源为空(单击下一步按钮),然后没有记录显示...任何猜测?
    • @tariq 除非您在预渲染之前为其分配了一些数据,否则数据源将为空。或者您可以在调用 DataBind 方法之前再次分配数据。但更好的处理方法是使用 PagePropertiesChanged 事件,如上所述。
    【解决方案2】:

    另一种解决方案,很简单,只需从数据库中获取“QUERY-STRING”中的“ID”,现在将其设置为 Pager Control 属性为 [ QueryStringField="ID" ],如:

    <asp:DataPager ID="DataPagerProducts" runat="server" QueryStringField="ID" PageSize="3">
                                <Fields>
                                    <asp:NextPreviousPagerField ShowFirstPageButton="True" ShowNextPageButton="False" />
                                    <asp:NumericPagerField />
                                    <asp:NextPreviousPagerField ShowLastPageButton="True" ShowPreviousPageButton="False" />
                                </Fields>
                            </asp:DataPager>
    

    注意:如果不唤醒,则还要设置[ PagedControlID="ListView_Name" ]

    【讨论】:

    • 这个答案毫无意义。
    【解决方案3】:

    看看 ListViewPagedDataSource。

    private ListViewPagedDataSource GetProductsAsPagedDataSource(DataView dv)
    {
    // Limit the results through a PagedDataSource
    ListViewPagedDataSource pagedData = new ListViewPagedDataSource();
    pagedData.DataSource = dv;
    pagedData.MaximumRows = dv.Table.Rows.Count;
    pagedData.TotalRowCount = dpTop.PageSize;
    
    if (Request.QueryString[dpTop.QueryStringField] != null)
      pagedData.StartRowIndex = (Convert.ToInt32(Request.QueryString[dpTop.QueryStringField]) - 1) * dpTop.PageSize;
    else
      pagedData.StartRowIndex = 0;
    
    return pagedData;
    }
    

    不过,我在查看最后一页时遇到了问题。 DataPager 跳回第一页,但显示的数据是最后一页。

    【讨论】:

      【解决方案4】:

      此外,如果您的 ListView 的数据源发生更改(例如,如果根据搜索参数显示数据),请不要忘记在每次更新数据源时重置分页器。使用 ListView,这不像其他一些数据绑定控件(例如 GridView)那么简单:

      private void ResetListViewPager()
      {
          DataPager pager = (DataPager)ListViewMembers.FindControl("DataPager1");
          if (pager != null)
          {
              CommandEventArgs commandEventArgs = new CommandEventArgs(DataControlCommands.FirstPageCommandArgument, "");
              // MAKE SURE THE INDEX IN THE NEXT LINE CORRESPONDS TO THE CORRECT FIELD IN YOUR PAGER
              NextPreviousPagerField nextPreviousPagerField = pager.Fields[0] as NextPreviousPagerField;
              if (nextPreviousPagerField != null)
              {
                  nextPreviousPagerField.HandleEvent(commandEventArgs);
              }
      
              // THIS COMMENTED-OUT SECTION IS HOW IT WOULD BE DONE IF USING A NUMERIC PAGER RATHER THAN A NEXT/PREVIOUS PAGER
              //commandEventArgs = new CommandEventArgs("0", "");
              //NumericPagerField numericPagerField = pager.Fields[0] as NumericPagerField;
              //if (numericPagerField != null)
              //{
              //    numericPagerField.HandleEvent(commandEventArgs);
              //}
          }
      }
      

      【讨论】:

        【解决方案5】:

        在 datapager 的预渲染事件而不是在页面加载时绑定列表视图。请看solution here

        【讨论】:

          【解决方案6】:
          <asp:ListView ID="ListView1" runat="server" DataSourceID="sdsImages">
              <ItemTemplate>
                  <div class="photo sample12">
                          <asp:Image ID="img_Galerie" runat="server" ImageUrl='<%# "~/imageHandler.ashx?ID=" + Eval("ImageID") %>' />
                  </div>
              </ItemTemplate>
          </asp:ListView>
          <asp:DataPager ID="DataPager1" runat="server" PagedControlID="ListView1" PageSize="3" QueryStringField="ImageID">
              <Fields>
                  <asp:NextPreviousPagerField ShowFirstPageButton="True" ShowNextPageButton="False" />
                  <asp:NumericPagerField />
                  <asp:NextPreviousPagerField ShowLastPageButton="True" ShowPreviousPageButton="False" />
              </Fields>
          </asp:DataPager>
          <asp:SqlDataSource ID="sdsImages" runat="server"
              ConnectionString="<%$ ConnectionStrings:DBCS %>"
              SelectCommand="SELECT ImageID FROM  Images ">
          

          【讨论】:

          • 你能解释一下吗?
          【解决方案7】:

          试试这个:

          protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
          {
              DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
              ListView1.DataSource = productList;
              ListView1.DataBind();
              DataPager1.DataBind();
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-31
            • 1970-01-01
            • 1970-01-01
            • 2019-05-22
            • 1970-01-01
            相关资源
            最近更新 更多