ASP.NET DataList分页点击最后一页报错:索引负数或超出行数
分页功能错误修复方案
问题现象
- 点击
btn_Last按钮时抛出异常:System.IndexOutOfRangeException: 'Index -6 is negative or over number of rows.',修改PageSize值后,错误中的索引值与设置的PageSize完全一致。 - 取消
btnPre_Click和btnNext_Click中注释的判断代码后,分页切换功能失效,按钮无法正常触发分页跳转。
核心原因
- 类级别
objPds被局部变量覆盖:在ItemsGet方法内部重新声明了PagedDataSource objPds局部变量,导致类定义的全局objPds从未被正确初始化(未绑定数据源、未配置分页参数)。在btnLast_Click、btnNext_Click中访问的是全局objPds,此时它的PageCount为0,计算出的页码索引为负数(如lastPageIndex = 0 - 1 = -1),最终在ItemsGet中设置CurrentPageIndex为无效值时,触发索引越界异常。 - 判断逻辑依赖未初始化对象:
btnPre_Click和btnNext_Click中的判断代码依赖全局objPds,但该对象未完成初始化,导致判断条件始终不成立,分页跳转逻辑无法执行。
修复方案
- 移除
ItemsGet方法内的局部objPds声明,直接使用类级别的objPds实例,确保所有按钮事件访问的是同一个已正确配置的分页数据源。 - 恢复
btnPre_Click和btnNext_Click中的判断代码,此时依赖的objPds已完成初始化,判断逻辑可正常生效。 - 使用
using语句管理数据库连接,自动释放资源,避免连接泄漏。
修改后的完整代码
public partial class mainpage : System.Web.UI.Page { string connection = "Data Source=localhost;Initial Catalog=Sefa;Integrated Security=True"; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { ItemsGet(); } } PagedDataSource objPds = new PagedDataSource(); private void ItemsGet() { // 使用using自动释放数据库连接 using (SqlConnection baglanti = new SqlConnection(connection)) { string komut = "SELECT * FROM Users"; baglanti.Open(); SqlCommand command = new SqlCommand(komut, baglanti); SqlDataAdapter dataAdapter = new SqlDataAdapter(command); DataSet dataSet = new DataSet(); dataAdapter.Fill(dataSet); // 直接使用类级别objPds,不再声明局部变量 objPds.AllowPaging = true; objPds.PageSize = 6; objPds.DataSource = dataSet.Tables[0].DefaultView; objPds.CurrentPageIndex = CurrentPage; lblCurrentPage.Text = "Page: " + (CurrentPage + 1).ToString() + " of " + objPds.PageCount.ToString(); btnFirst.Enabled = !objPds.IsFirstPage; btnPre.Enabled = !objPds.IsFirstPage; btnNext.Enabled = !objPds.IsLastPage; btnLast.Enabled = !objPds.IsLastPage; DataList2.DataSource = objPds; DataList2.DataBind(); } } protected void btnFirst_Click(object sender, EventArgs e) { CurrentPage = 0; ItemsGet(); } protected void btnPre_Click(object sender, EventArgs e) { if (CurrentPage > 0) { CurrentPage -= 1; ItemsGet(); } } protected void btnNext_Click(object sender, EventArgs e) { if (CurrentPage < objPds.PageCount - 1) { CurrentPage += 1; ItemsGet(); } } protected void btnLast_Click(object sender, EventArgs e) { int lastPageIndex = objPds.PageCount - 1; CurrentPage = lastPageIndex; ItemsGet(); } public int CurrentPage { get { object o = this.ViewState["_CurrentPage"]; return o == null ? 0 : (int)o; } set { this.ViewState["_CurrentPage"] = value; } } }
内容的提问来源于stack exchange,提问作者Furkan Sefa TUNÇ
相关产品推荐
相关产品推荐

