ASP.NET DataGrid分页失效:仅显示第1页且页码不可点击
解决ASP.NET DataGrid分页不生效的问题
你的DataGrid分页失效主要是因为开启了自定义分页(AllowCustomPaging=true)但未实现对应的分页数据逻辑,加上细节设置错误,导致页码显示异常且无法切换。下面一步步帮你修正:
问题分析
- 自定义分页未做数据筛选:当
AllowCustomPaging=true时,DataGrid不会自动处理分页,需要你手动根据当前页索引和页大小,从数据库查询对应页的数据。你现在的BindGrid()方法直接查询全部数据,导致DataGrid只能识别第一页内容。 VirtualItemCount硬编码错误:这个属性需要设置为真实的总记录数,而不是固定的1000,否则DataGrid无法正确计算总页数和可点击页码。- 数据库资源释放不规范:你的连接和命令未用
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
相关产品推荐
相关产品推荐

