可以借助于GridView与AspNetPager(强大的开源分页控件)实现ASP.NET获取数据表格时的分页。
GridView分页功能较弱,分页切换速度不如AspNetPager。
两者可单独使用,也可结合起来使用,即使用GridView进行数据的显示,AspNetPager进行页码的切换操作。
GridView分页时需要注意的地方:
1. 当使用它点击其他页时,GridView将重新分配Rows.Count的值为当前页得记录数,而不是DataSource里的总记录数。
2. 分页时需要重新执行数据绑定。
为便于确认各行数据所在的行,指定GridView各行记录的索引键值。
如:
this.GridView1.DataSource = CustmTable; this.GridView1.DataKeyNames = new string[] { "ID" };//主键 this.GridView1.DataBind();
GridView分页显示后出现索引超出范围错误解决办法,即出现上述第1个需要注意的情况:
// GridView分页显示后出现索引超出范围错误解决办法 int iPageIndex = GridView1.PageIndex; //获取当前页索引 int iPageSize = GridView1.PageSize; //获取每页显示记录数 int iIndex = Convert.ToInt16(GridView1.Rows[i].DataItemIndex) - iPageIndex * iPageSize; //计算 int id = Convert.ToInt32(GridView1.DataKeys[iIndex].Value);
GridView分页时数据重新绑定,即第2个需要注意的情况的解决:可以在首次指定数据集进行数据绑定时把数据集以静态成员变量的形式(static)保存起来。
int iPageIndex = GridView1.PageIndex; //获取当前页索引 int iPageSize = GridView1.PageSize; //获取每页显示记录数 int iIndex = 0; for (int i = 0; i < this.GridView1.DataKeys.Count; i++) { if(searchKey = Convert.ToInt32(this.GridView1.DataKeys[i].Value)) iIndex = i; }
从DataTable.Rows中删除行,不应该使用DataTable.Rows.RemoveAt(i)或者DataTable.Rows[i].Delete(), 两者都会减少DataTable.Rows.Count的数值大小,容易产生bug。比较好的方式是倒序删除行。
DataTable dt; // ... for(int i = dt.Rows.Count - 1; i >= 0; i--) { dt.Rows.RemoveAt(i); }
参考自:
GridView分页后RowCommand出错:索引超出范围 http://www.cnblogs.com/X-Jonney/archive/2009/05/20/1467804.html
使用AspNetPager与GridView完成分页 http://www.cnblogs.com/studyzy/archive/2008/07/30/1256877.html