【问题标题】:ASP.NET GridView Paging with IQueryable带有 IQueryable 的 ASP.NET GridView 分页
【发布时间】:2012-04-11 20:24:24
【问题描述】:

我目前正在使用 IPagedList 来有效地分页我的数据。

与 GridView 一起使用时,我可以在 GridView.PageIndexChanging 事件中设置页面索引并重新绑定网格。

问题是,GridView.PageCount 属性是只读的,所以默认分页器只显示 1 页。

我想我将不得不推出自己的 GridView 实现来解决这个问题?有没有人已经做过了?

【问题讨论】:

    标签: asp.net gridview


    【解决方案1】:

    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();
        }
    

    希望这会有所帮助。

    【讨论】:

    • 嗨,我知道这是不久前发布的。我厌倦了这个,并且在大多数情况下它都有效。但是,当我在第二页(页面大小为 20)上时,将调用页面加载 InitializePage 并且我注意到 PagedDataSource.DataSource 是一个虚拟数据源。这就是导致我出现问题的原因。后来,在 page_load 事件之后,我尝试做 GridView.rows.count,它显示我在列表中有项目,而我在第二页上只有 18 个。我检查了那个列表,那 18 页是正确的,但是还有 2 个额外的项目是空的。有什么线索吗?
    【解决方案2】:

    这是我在绑定IQueryable时用gridview完成分页和排序的:http://bradoyler.com/post/399042473/using-the-asp-net-gridview-with-objectdatasource-and

    希望也有帮助!

    【讨论】:

    • 感谢 Brad,Dynamic Linq 使这成为一种非常有用的方法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2010-10-13
    • 2016-09-14
    相关资源
    最近更新 更多