ASP.NET GridView修改SelectCommand过滤后表头掉入表体问题求助
问题原因
- 首次页面加载时
$(document).ready触发,DataTables 正确识别 GridView 生成的<thead>结构完成初始化,表头固定正常。 - 按钮点击触发回发后,GridView 重新绑定数据,原有表格 DOM 结构被覆盖,DataTables 旧实例失效,且没有重新执行初始化逻辑,导致表头没有被插件正确处理,直接落入
<tbody>区域。 - 后台表头设置逻辑时机不对,未保证每次数据绑定完成后都正确生成
<thead>标签。
解决方案
第一步:调整后台表头设置逻辑
给 GridView 绑定 DataBound 事件,保证每次数据绑定完成后统一设置表头结构,避免重复代码。
- 修改前端 GridView 标签,添加
OnDataBound属性:
<asp:GridView ID="SpNLog" runat="server" UseAccessibleHeader="true" AutoGenerateColumns="False" DataSourceID="MyDS1" CssClass="table is-striped" Style="width: 100%; font-size: small;" OnDataBound="SpNLog_DataBound">
- 后台添加对应事件处理方法:
protected void SpNLog_DataBound(object sender, EventArgs e) { if (SpNLog.HeaderRow != null) { SpNLog.HeaderRow.TableSection = TableRowSection.TableHeader; SpNLog.UseAccessibleHeader = true; } }
- 删除页面加载、按钮点击事件中重复的表头设置代码,仅保留 SelectCommand 赋值逻辑即可。
第二步:调整前端 DataTables 初始化逻辑
封装初始化方法,保证首次加载、回发后都能正确初始化,同时避免重复初始化冲突。
// 公共初始化方法 function initSpNLogTable() { // 先销毁已存在的实例,避免冲突 if ($.fn.DataTable.isDataTable('#SpNLog')) { $('#SpNLog').DataTable().destroy(); } // 重新初始化 $('#SpNLog').DataTable({ scrollY: '40vh', scrollCollapse: true, paging: false, searching: false, info: false, columnDefs: [ { targets: [1, 2, 3, 4], className: "text-center", } ] }); } // 首次页面加载执行 $(document).ready(function () { initSpNLogTable(); }); // 若使用了UpdatePanel做局部刷新,添加以下代码,局部回发后重新初始化 if (typeof Sys !== 'undefined') { Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function () { initSpNLogTable(); }); }
验证说明
调整完成后,每次触发数据过滤回发,都会先重新生成正确的 <thead> 结构,再重新初始化 DataTables 插件,表头即可正常固定。
内容的提问来源于stack exchange,提问作者Abd El-Rahman Sayed
相关产品推荐
相关产品推荐

