GridView分页报错:数据源不支持服务器端数据分页
解决GridView“数据源不支持服务器端数据分页”错误
嘿,这个问题我碰到过好多次了!你遇到的报错核心原因是:你绑定给GridView的数据源没有实现支持服务器端分页的接口(比如直接用了List、DataTable这类普通集合,它们本身不具备分页能力)。下面给你两种实用的解决思路:
方法1:用PagedDataSource包装数据源(快速适配)
这是最省事的方案,用.NET自带的PagedDataSource类把你的原始数据源(比如DataTable、List)包装成支持分页的格式,直接给GridView用就行:
改造你的绑定方法:
public void BindGridviewActivity() { // 1. 先获取你的原始数据源(这里替换成你原来获取数据的逻辑) DataTable activityData = GetActivityDataFromDB(); // 比如从数据库查全量数据 // 2. 用PagedDataSource包装 PagedDataSource pagedData = new PagedDataSource(); pagedData.DataSource = activityData.DefaultView; // 绑定原始数据源的视图 pagedData.AllowPaging = true; // 开启分页 pagedData.PageSize = gwActivity.PageSize; // 每页显示条数,和GridView保持一致 pagedData.CurrentPageIndex = gwActivity.PageIndex; // 当前页码 // 3. 绑定到GridView gwActivity.DataSource = pagedData; gwActivity.DataBind(); }
确保PageIndexChanging事件正确处理:
protected void gwActivity_PageIndexChanging(object sender, GridViewPageEventArgs e) { // 更新当前页码 gwActivity.PageIndex = e.NewPageIndex; // 重新绑定数据(关键!必须重新绑) BindGridviewActivity(); }
方法2:数据库层面分页(大数据量推荐)
如果你的数据量很大,全量查询再分页会浪费性能,建议直接在数据库里只查当前页的数据,同时返回总记录数让GridView知道总页数:
改造绑定方法(以SQL Server为例):
public void BindGridviewActivity(int currentPageIndex) { int pageSize = gwActivity.PageSize; int startRow = currentPageIndex * pageSize + 1; int endRow = (currentPageIndex + 1) * pageSize; // 1. 分页查询当前页数据(用ROW_NUMBER()生成行号筛选) string pageSql = @"SELECT * FROM ( SELECT *, ROW_NUMBER() OVER(ORDER BY ActivityID DESC) AS RowNum FROM YourActivityTable ) AS TempTable WHERE RowNum BETWEEN @StartRow AND @EndRow"; // 执行SQL获取当前页的DataTable(这里替换成你的数据库操作逻辑) DataTable currentPageData = ExecuteSqlQuery(pageSql, startRow, endRow); // 2. 获取总记录数,用来显示总页数 int totalRecords = GetTotalActivityCount(); // 比如执行SELECT COUNT(*) FROM YourActivityTable gwActivity.VirtualItemCount = totalRecords; // 设置总记录数 // 3. 绑定数据 gwActivity.DataSource = currentPageData; gwActivity.DataBind(); }
处理PageIndexChanging事件:
protected void gwActivity_PageIndexChanging(object sender, GridViewPageEventArgs e) { gwActivity.PageIndex = e.NewPageIndex; // 传入新页码重新绑定 BindGridviewActivity(e.NewPageIndex); }
额外检查点:
- 确认你的GridView的
AllowPaging属性已经设为True(从你的ASPX代码看已经加了,这点没问题) - 如果用的是
ObjectDataSource,记得开启它的EnablePaging属性,并且指定SelectCountMethod(获取总记录数的方法)
内容的提问来源于stack exchange,提问作者Nils
相关产品推荐
相关产品推荐

