20

从我读过的所有内容来看,似乎将分页添加到 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
4

7 回答 7

30

我们需要在 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()
}
于 2008-12-29T23:43:34.763 回答
4

另一种解决方案,很简单,只需从数据库中获取“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" ]

于 2012-11-12T05:35:22.403 回答
1

看看 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 跳回第一页,但显示的数据是最后一页。

于 2008-10-25T21:26:00.730 回答
1

此外,如果您的 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);
        //}
    }
}
于 2010-01-11T13:01:02.440 回答
1

在 datapager 的预渲染事件而不是在页面加载时绑定列表视图。请在此处查看解决方案

于 2011-12-09T16:49:43.943 回答
0
<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 ">

于 2013-03-15T19:35:47.813 回答
0

试试这个:

protected void ListView1_PagePropertiesChanging(object sender, PagePropertiesChangingEventArgs e)
{
    DataPager1.SetPageProperties(e.StartRowIndex, e.MaximumRows, false);
    ListView1.DataSource = productList;
    ListView1.DataBind();
    DataPager1.DataBind();
}
于 2013-11-06T21:18:47.580 回答