2010-05-17 46 views
5

我有一個分頁的ASP.NET ListView。顯示的數據被過濾,可以通過表單控制。當過濾器表單發生變化時,我創建一個新的查詢,並執行一個DataBind。如何強制ListView以編程方式顯示第一頁

但是,當我轉到下一頁並設置過濾器時,ListView顯示「沒有數據返回」。這並不奇怪,因爲在應用過濾器之後,只有一頁數據。

所以我想要做的就是重置尋呼機。這是對問題的正確解決方案嗎?我該怎麼做?

+0

您是否在Pager中使用QueryStringFields或從ViewState中使用QueryStringFields? – eugeneK 2010-05-17 13:45:31

+0

沒有。我正在做的唯一非標準事情是,我重建每個回發的Linq查詢... – doekman 2010-05-17 14:27:59

回答

9

我用這個黑客在我的加載處理。如果結果項目的數量相同,它將不會重置尋呼機,但頁面索引仍然有效,因此我現在可以忍受。

+0

適合我。一定要在列表視圖是數據綁定之前設置它。 – rdans 2013-11-27 14:27:56

4

如果你知道如何去做,那很簡單。我添加下面的代碼到我的onchange -events我的過濾器:

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

上述任一解決方案都是正確的,因爲它們都調用相同的方法。我只是覺得應該指出,你應該在任何你希望你的數據源(即列表或數組等)被更新的地方調用yourPagerElement.SetPageProperties(...)。例如,在應用一些過濾之後或者大大改變列表大小的東西。

0

你可能有問題,如果你的列表視圖自動爲界(即ObjectDataSource控件)

Load事件處理程序不工作,因爲你還沒有新的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分頁,並且只返回的數據顯示,所以我需要重新綁定數據源德(最後一個參數(真))

缺點:雙數據綁定如果StartRowIndex比TotalRowCount更大。

相關問題