ASP.NET Web Form点击GridView页码后控件隐藏问题排查与解决
ASP.NET Web Form GridView分页后隐藏问题解决
问题现象
开发ASP.NET Web Form项目时,点击搜索按钮可正常显示带分页功能的GridView数据,但切换GridView任意页码后,控件会隐藏。
问题原因
- 重复定义分页事件方法:后台代码中存在两个完全相同的
grdData_PageIndexChanging方法,会导致编译错误,破坏分页逻辑的正常执行。 - 空数据场景未处理:
BindGrdiview方法仅在数据行数大于0时才绑定GridView,而分页事件中直接绑定数据源未做判断。当GetDataForSearch返回空DataTable时,GridView因无有效数据源绑定而隐藏。 - 下拉框选中值可能丢失:若
dropBranches下拉框未正确维护ViewState,或其绑定逻辑未放在!IsPostBack判断中,回发时会丢失选中值,导致查询参数为空,最终返回空数据,GridView绑定后隐藏。
解决方案
1. 移除重复的分页事件方法
删除后台代码中重复的grdData_PageIndexChanging方法,仅保留一个实例。
2. 统一GridView绑定逻辑,处理空数据
修改BindGrdiview方法,去掉行数判断,直接绑定数据源,同时在GridView中添加空数据模板,避免控件隐藏:
后台代码修改
public void BindGrdiview() { DataTable dt = GetDataForSearch(dropBranches.SelectedItem.Value); GridViewSearchData.DataSource = dt; GridViewSearchData.DataBind(); } protected void grdData_PageIndexChanging(object sender, GridViewPageEventArgs e) { GridViewSearchData.PageIndex = e.NewPageIndex; BindGrdiview(); // 复用绑定逻辑,保证处理一致 }
ASPX页面添加空数据模板
<asp:GridView ID="GridViewSearchData" runat="server" AutoGenerateColumns="false" DataKeyNames="ID" CssClass="table" HeaderStyle-BackColor="#172b4d" AllowPaging="true" OnPageIndexChanging="grdData_PageIndexChanging" PageSize="10"> <!-- 添加空数据模板,无数据时显示提示而非隐藏控件 --> <EmptyDataTemplate> <div style="text-align:center; padding: 20px;">暂无匹配数据</div> </EmptyDataTemplate> <Columns> <asp:BoundField DataField="BranchCode" HeaderText="BranchCode" HeaderStyle-ForeColor="White" /> <asp:BoundField DataField="Status" HeaderText="Status" HeaderStyle-ForeColor="White" /> <asp:BoundField DataField="OrderNo" HeaderText="OrderNo" ItemStyle-Width="120px" HeaderStyle-ForeColor="White" /> <asp:BoundField DataField="OrderType" HeaderText="OrderType" HeaderStyle-ForeColor="White" /> <asp:BoundField DataField="Printer_name" HeaderText="Printer_name" HeaderStyle-ForeColor="White" /> <asp:BoundField DataField="EntredDatetime" HeaderText="EntredDatetime" HeaderStyle-ForeColor="White" /> <asp:BoundField DataField="Id" HeaderText="Id" ItemStyle-CssClass="hidden" HeaderStyle-CssClass="hidden" /> </Columns> </asp:GridView>
3. 确保下拉框选中值在回发时保留
确保dropBranches的绑定逻辑放在!IsPostBack判断中,避免回发时重新绑定覆盖选中值:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 绑定下拉框数据(需自行实现BindDropBranches方法) BindDropBranches(); BindGrdiview(); } } private void BindDropBranches() { // 示例:从数据库获取分支列表绑定到dropBranches // DataTable branchDt = GetBranchList(); // dropBranches.DataSource = branchDt; // dropBranches.DataTextField = "vBranchDesc"; // dropBranches.DataValueField = "BranchID"; // dropBranches.DataBind(); }
4. 优化数据查询方法(可选)
在GetDataForSearch方法中,预先定义DataTable结构,避免异常时返回无结构的空表,同时使用using自动释放资源:
public DataTable GetDataForSearch(string BranchId) { DataTable dt = new DataTable(); // 预先定义DataTable结构,避免异常时返回无结构的空表 dt.Columns.Add("EntredDatetime", typeof(DateTime)); dt.Columns.Add("OrderType", typeof(string)); dt.Columns.Add("OrderNo", typeof(string)); dt.Columns.Add("Printer_name", typeof(string)); dt.Columns.Add("BranchCode", typeof(string)); dt.Columns.Add("Status", typeof(string)); dt.Columns.Add("Id", typeof(int)); try { using (SqlConnection conn = new SqlConnection("你的数据库连接字符串")) { conn.Open(); using (SqlCommand cmd = new SqlCommand()) { cmd.Connection = conn; cmd.CommandText = "select datelogged AS EntredDatetime, Doc_type AS OrderType,Doc_number as OrderNo, Printer_name, [dbo].[tbl_Branch].vBranchDesc AS BranchCode,case when Status=0 then 'Waiting for PDF' when Status=1 then 'Waiting for Printing' when Status=2 then 'Printed' when Status in (8,9) then 'Error in PDF generation' Else 'Error in Printing' end as Status, id from Print_Report where BranchID=@BranchCode"; cmd.CommandType = CommandType.Text; cmd.CommandTimeout = 50000; cmd.Parameters.AddWithValue("@BranchCode", BranchId); SqlDataAdapter sda = new SqlDataAdapter(cmd); sda.Fill(dt); } } } catch (Exception ex) { // 建议记录异常日志,便于排查问题 } return dt; }
内容的提问来源于stack exchange,提问作者ahmed abdelaziz
相关产品推荐
相关产品推荐

