如何强制ListView以编程方式显示第一页

时间:2010-05-17 13:37:32

标签: asp.net listview pager

我有一个分页的ASP.NET ListView。显示的数据被过滤,可以通过表单控制。当筛选器表单更改时,我创建一个新查询,并执行DataBind。

问题是,当我转到下一页并设置过滤器时,ListView显示“没有返回数据”。这并不奇怪,因为在应用过滤器之后,只有一页数据。

所以我想要做的就是重置寻呼机。这是解决问题的正确方法吗?我该怎么做?

4 个答案:

答案 0 :(得分:9)

我在Load处理程序中使用此hack。如果结果项的数量相同,它将不会重置寻呼机,但页面索引仍然有效,所以我现在可以使用它。

if (IsPostBack)
{
    DataPager pgr = MyListView.FindControl("MyPager") as DataPager;
    if (pgr != null && MyListView.Items.Count != pgr.TotalRowCount)
    {
        pgr.SetPageProperties(0, pgr.MaximumRows, false);
    }
}

答案 1 :(得分:4)

如果你知道怎么做,那很简单。我将以下代码添加到我的onchange - 我的过滤器的事件中:

DataPager pager = ListViewReference.FindControl("DataPagerId") as DataPager;
if (pager != null)
{
    pager.SetPageProperties(0, pager.PageSize, true);
}

答案 2 :(得分:1)

上述任一解决方案都是正确的,因为它们都调用相同的方法。我只是认为应该指出,您应该在任何您想要更新数据源(即列表或数组等)的地方调用yourPagerElement.SetPageProperties(...)。例如,在应用一些过滤或大大改变列表大小的东西之后。

答案 3 :(得分:0)

如果列表视图自动受限(即ObjectDataSource)

,则可能会出现问题

加载事件处理程序不起作用,因为您还没有新的DataPager.TotalRowPage值,但是您可以处理Page_PreRenderComplete,如下所示:

    protected void Page_PreRenderComplete(object sender, EventArgs e)
    {
        // PreRenderComplete occurs just after databindings page events
        // And saves to viewstate

        // Trick on search to avoid "No data" on results when old page is greater than actual row count                
        if (DataPager1.StartRowIndex  > DataPager1.TotalRowCount )
            DataPager1.SetPageProperties(0, DataPager1.MaximumRows, true);
    }

这总是会在包含数据的页面中留下ListView。如果页面大于TotalRow,请切换到第一页。

注意:我使用了有效的分页,只返回要显示的数据,所以我需要重新绑定de datasource(最后一个参数(true))

缺点:如果StartRowIndex大于TotalRowCount,则为双数据绑定。