You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET DataList分页点击最后一页报错:索引负数或超出行数

分页功能错误修复方案

问题现象

  • 点击btn_Last按钮时抛出异常:System.IndexOutOfRangeException: 'Index -6 is negative or over number of rows.',修改PageSize值后,错误中的索引值与设置的PageSize完全一致。
  • 取消btnPre_Click和btnNext_Click中注释的判断代码后,分页切换功能失效,按钮无法正常触发分页跳转。

核心原因

  1. 类级别objPds被局部变量覆盖:在ItemsGet方法内部重新声明了PagedDataSource objPds局部变量,导致类定义的全局objPds从未被正确初始化(未绑定数据源、未配置分页参数)。在btnLast_Click、btnNext_Click中访问的是全局objPds,此时它的PageCount为0,计算出的页码索引为负数(如lastPageIndex = 0 - 1 = -1),最终在ItemsGet中设置CurrentPageIndex为无效值时,触发索引越界异常。
  2. 判断逻辑依赖未初始化对象:btnPre_Click和btnNext_Click中的判断代码依赖全局objPds,但该对象未完成初始化,导致判断条件始终不成立,分页跳转逻辑无法执行。

修复方案

  1. 移除ItemsGet方法内的局部objPds声明,直接使用类级别的objPds实例,确保所有按钮事件访问的是同一个已正确配置的分页数据源。
  2. 恢复btnPre_Click和btnNext_Click中的判断代码,此时依赖的objPds已完成初始化,判断逻辑可正常生效。
  3. 使用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Ç

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:04:54