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

Asp.net 如何强制ListView以编程方式显示第一页,asp.net,listview,pager,Asp.net,Listview,Pager,我有一个分页的ASP.NET列表视图。显示的数据经过过滤,可由表单控制。当过滤器表单更改时,我创建一个新查询,并执行数据绑定 然而,当我转到下一页并设置过滤器时,ListView显示“未返回任何数据”。这并不奇怪,因为应用过滤器后,只有一页数据 所以我要做的是重置寻呼机。这是解决问题的正确方法吗?我该怎么做呢?如果你知道怎么做,那很简单。我将下面的代码添加到我的过滤器的onchange-事件中: DataPager pager = ListViewReference.FindControl("D

我有一个分页的ASP.NET列表视图。显示的数据经过过滤,可由表单控制。当过滤器表单更改时,我创建一个新查询,并执行数据绑定

然而,当我转到下一页并设置过滤器时,ListView显示“未返回任何数据”。这并不奇怪,因为应用过滤器后,只有一页数据


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

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

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

我在我的加载处理程序中使用这个hack。如果结果项的数量相同,它不会重置寻呼机,但是页面索引仍然有效,因此我现在可以接受它

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

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

如果listview自动绑定(即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,则切换到第一页

注意:我正在使用efective分页,并且只返回要显示的数据,因此我需要重新绑定de datasource(最后一个参数(true))


缺点:如果StartRowWindex大于TotalRowCount,则使用双重数据绑定。

您是在寻呼机中使用QueryStringFields还是在ViewState中使用QueryStringFields?否。我正在做的唯一一件非标准的事情是,我用每次回发来重建Linq查询……对我来说很有用。确保在列表视图绑定数据之前设置此选项。