2010-09-09 45 views
1

我目前使用IPagedList來有效地分頁我的數據。ASP.NET GridView與IQueryable分頁

當與GridView一起使用時,我可以在GridView.PageIndexChanging事件中設置頁面索引並重新綁定網格。

問題是,GridView.PageCount屬性是隻讀的,所以默認的pager只顯示1頁。

我想我將不得不推出我自己的GridView實現來解決這個問題?有沒有人得到他們已經完成的一個?

回答

6

幫助this post我創建了我自己的自定義GridView控件,它允許我重寫尋呼機的初始化並設置記錄數。

public class CustomGridView : GridView 
{ 
    private const string _virtualItemCount = "virtualItemCount"; 
    private const string _currentPageIndex = "currentPageIndex"; 

    [Browsable(true), Category("Custom")] 
    [Description("Set the virtual item count for this grid")] 
    public int VirtualItemCount { 
     get 
     { 
      if (ViewState[_virtualItemCount] == null) 
       ViewState[_virtualItemCount] = -1; 
      return Convert.ToInt32(ViewState[_virtualItemCount]); 
     } 
     set 
     { 
      ViewState[_virtualItemCount] = value; 
     } 
    } 

    private int CurrentPageIndex 
    { 
     get 
     { 
      if (ViewState[_currentPageIndex] == null) 
       ViewState[_currentPageIndex] = 0; 
      return Convert.ToInt32(ViewState[_currentPageIndex]); 
     } 
     set 
     { 
      ViewState[_currentPageIndex] = value; 
     } 
    } 

    public override object DataSource 
    { 
     get 
     { 
      return base.DataSource; 
     } 
     set 
     { 
      base.DataSource = value; 
      this.CurrentPageIndex = this.PageIndex; 
     } 
    } 

    protected override void InitializePager(GridViewRow row, int columnSpan, PagedDataSource pagedDataSource) 
    { 
     if (CustomPaging) 
     { 
      pagedDataSource.VirtualCount = this.VirtualItemCount; 
      pagedDataSource.CurrentPageIndex = this.CurrentPageIndex; 
     } 
     base.InitializePager(row, columnSpan, pagedDataSource); 
    } 

    public bool CustomPaging { 
     get { return (this.VirtualItemCount != -1); } 
    } 
} 

然後在CustomGridView.PageIndexChanging事件,我們設定的頁面索引,並重新加載我們的數據(通過頁面索引和頁面大小,我們的資源庫法):

protected void gvAccounts_PageIndexChanging(object sender, GridViewPageEventArgs e) 
    { 
     gvAccounts.PageIndex = e.NewPageIndex; 
     BindGrid(e.NewPageIndex, gvAccounts.PageSize); 
    } 


    protected void BindGrid(int pageIndex, int pageSize) 
    { 
     var accounts = AccountManager.GetAllAccounts<int>(pageIndex, pageSize, x=> x.AccountId); 
     gvAccounts.VirtualItemCount = accounts.TotalCount; 
     gvAccounts.DataSource = accounts; 
     gvAccounts.DataBind(); 
    } 

希望這有助於。

+0

嗨,我知道這是發佈前一段時間。我厭倦了這一點,並在大多數情況下,它的作品但是,當我在第二頁(頁面大小爲20)時,頁面正在加載時InitializePage將被調用,並且我不記錄PagedDataSource.DataSource是一個dummydatasource。這就是導致我出問題的原因。稍後,在page_load事件之後,我嘗試了GridView.rows.count,它向我展示了列表中的項目,而第二頁上只有18個項目。我在那張清單裏面檢查,這18頁是正確的,但是有兩個額外的項目是空的。任何線索? – Dhana 2013-06-24 15:30:00