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

ASP.NET Web Form点击GridView页码后控件隐藏问题排查与解决

ASP.NET Web Form GridView分页后隐藏问题解决

问题现象

开发ASP.NET Web Form项目时,点击搜索按钮可正常显示带分页功能的GridView数据,但切换GridView任意页码后,控件会隐藏。

问题原因

  1. 重复定义分页事件方法:后台代码中存在两个完全相同的grdData_PageIndexChanging方法,会导致编译错误,破坏分页逻辑的正常执行。
  2. 空数据场景未处理:BindGrdiview方法仅在数据行数大于0时才绑定GridView,而分页事件中直接绑定数据源未做判断。当GetDataForSearch返回空DataTable时,GridView因无有效数据源绑定而隐藏。
  3. 下拉框选中值可能丢失:若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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:12:30