我目前使用IPagedList來有效地分頁我的數據。ASP.NET GridView與IQueryable分頁
當與GridView一起使用時,我可以在GridView.PageIndexChanging事件中設置頁面索引並重新綁定網格。
問題是,GridView.PageCount屬性是隻讀的,所以默認的pager只顯示1頁。
我想我將不得不推出我自己的GridView實現來解決這個問題?有沒有人得到他們已經完成的一個?
我目前使用IPagedList來有效地分頁我的數據。ASP.NET GridView與IQueryable分頁
當與GridView一起使用時,我可以在GridView.PageIndexChanging事件中設置頁面索引並重新綁定網格。
問題是,GridView.PageCount屬性是隻讀的,所以默認的pager只顯示1頁。
我想我將不得不推出我自己的GridView實現來解決這個問題?有沒有人得到他們已經完成的一個?
幫助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();
}
希望這有助於。
這是我用來實現分頁,裝訂和IQueryable的用時在GridView排序:http://bradoyler.com/post/399042473/using-the-asp-net-gridview-with-objectdatasource-and
希望幫助也!
感謝Brad,Dynamic Linq使它成爲一個非常有用的方法! – 2012-05-31 14:09:53
嗨,我知道這是發佈前一段時間。我厭倦了這一點,並在大多數情況下,它的作品但是,當我在第二頁(頁面大小爲20)時,頁面正在加載時InitializePage將被調用,並且我不記錄PagedDataSource.DataSource是一個dummydatasource。這就是導致我出問題的原因。稍後,在page_load事件之後,我嘗試了GridView.rows.count,它向我展示了列表中的項目,而第二頁上只有18個項目。我在那張清單裏面檢查,這18頁是正確的,但是有兩個額外的項目是空的。任何線索? – Dhana 2013-06-24 15:30:00