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

ASP.NET DataGrid分页失效:仅显示第1页且页码不可点击

解决ASP.NET DataGrid分页不生效的问题

你的DataGrid分页失效主要是因为开启了自定义分页(AllowCustomPaging=true)但未实现对应的分页数据逻辑,加上细节设置错误,导致页码显示异常且无法切换。下面一步步帮你修正:


问题分析

  1. 自定义分页未做数据筛选:当AllowCustomPaging=true时,DataGrid不会自动处理分页,需要你手动根据当前页索引和页大小,从数据库查询对应页的数据。你现在的BindGrid()方法直接查询全部数据,导致DataGrid只能识别第一页内容。
  2. VirtualItemCount硬编码错误:这个属性需要设置为真实的总记录数,而不是固定的1000,否则DataGrid无法正确计算总页数和可点击页码。
  3. 数据库资源释放不规范:你的连接和命令未用using包裹,可能导致资源泄漏(虽不是分页直接原因,但建议修正)。

修正后的代码

1. ASPX页面(无需大改,确认事件绑定正确)

你的页面代码基本没问题,只需确认事件绑定对应正确方法即可:

<asp:DataGrid ID="grid1" runat="server" AutoGenerateColumns="False" AllowPaging="True" PageSize="5" AllowCustomPaging="true" OnPageIndexChanged="grid1_PageIndexChanging">
    <HeaderStyle HorizontalAlign="Center" Height="30px"></HeaderStyle>
    <Columns>
        <asp:TemplateColumn HeaderText="ID" >
            <HeaderStyle Font-Underline="false" Height="15px" Width="5%" HorizontalAlign="Center" BackColor="#ccffcc"></HeaderStyle>
            <ItemStyle HorizontalAlign="Center"></ItemStyle>
            <ItemTemplate>
                <asp:Label id="lblID" runat="server" text='<%#DataBinder.Eval(Container.DataItem, "ID_")%>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateColumn>
    </Columns>
    <PagerStyle Font-Bold="True" ForeColor="black" HorizontalAlign="left" Wrap="True" Mode="NumericPages" />
    <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" />
</asp:DataGrid>

2. 后台CS代码(核心修改分页逻辑)

主要调整BindGrid()方法,实现分页查询并正确设置总记录数:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindGrid();
    }
}

protected void grid1_PageIndexChanging(object source, DataGridPageChangedEventArgs e)
{
    grid1.CurrentPageIndex = e.NewPageIndex;
    BindGrid();
}

private void BindGrid()
{
    string connectionString = gc.GetWebConfigConnectionStringAIS();
    
    // 1. 获取总记录数,用于设置VirtualItemCount
    int totalRecords = 0;
    using (SqlConnection con = new SqlConnection(connectionString))
    {
        string countQuery = "SELECT COUNT(*) FROM dbo.Testing";
        using (SqlCommand countCmd = new SqlCommand(countQuery, con))
        {
            con.Open();
            totalRecords = Convert.ToInt32(countCmd.ExecuteScalar());
            con.Close();
        }
    }
    grid1.VirtualItemCount = totalRecords;
    
    // 2. 根据当前页索引和PageSize查询对应页的数据
    int startIndex = grid1.CurrentPageIndex * grid1.PageSize;
    using (SqlConnection con = new SqlConnection(connectionString))
    {
        // SQL Server分页语法:用ROW_NUMBER()筛选当前页数据
        string query = @"
            SELECT ID_
            FROM (
                SELECT ID_, ROW_NUMBER() OVER(ORDER BY ID_) AS RowNum
                FROM dbo.Testing
            ) AS Temp
            WHERE RowNum BETWEEN @StartIndex + 1 AND @StartIndex + @PageSize";
        
        using (SqlCommand cmd = new SqlCommand(query, con))
        {
            cmd.Parameters.AddWithValue("@StartIndex", startIndex);
            cmd.Parameters.AddWithValue("@PageSize", grid1.PageSize);
            
            con.Open();
            using (SqlDataReader dr = cmd.ExecuteReader())
            {
                grid1.DataSource = dr;
                grid1.DataBind();
            }
            con.Close();
        }
    }
    
    grid1.Visible = true;
}

关键说明

  • 自定义分页核心:必须手动编写分页查询SQL,这里用ROW_NUMBER()实现SQL Server分页,确保只加载当前页需要的5条数据。如果是MySQL数据库,可替换为LIMIT @StartIndex, @PageSize语法。
  • VirtualItemCount设置:绑定真实总记录数后,DataGrid会自动计算总页数,生成正确的可点击页码。
  • 资源释放:用using包裹所有数据库相关对象,确保资源自动释放,避免内存泄漏。

内容的提问来源于stack exchange,提问作者illimite

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:19:16