2010-09-09 6 views
1

В настоящее время я использую IPagedList для эффективной работы с моими данными.ASP.NET GridView Paging с IQueryable

При использовании с GridView я могу установить индекс страницы в событии GridView.PageIndexChanging и перестроить сетку.

Проблема заключается в том, что свойство GridView.PageCount является readonly, поэтому по умолчанию для пейджера отображается только одна страница.

Я полагаю, что мне придется свертывать собственную реализацию 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 страниц верны, но есть 2 дополнительных элемента, которые пусты. Любая подсказка? – Dhana