VS2022中C# WinForms DataGridView首加载第1页行表头无编号问题
解决DataGridView首次加载第1页行表头无编号问题
问题分析
核心问题是首次绑定第1页数据后,未触发行表头编号的填充逻辑,而切换页码时会主动调用populateGridRowHeader方法,因此后续页面的行号显示正常。
解决方案
方案1:在BindGrid末尾主动触发行表头填充
修改BindGrid方法,设置数据源后直接计算当前页起始行号并调用填充方法,确保首次加载时执行行号渲染逻辑:
private void BindGrid(int pageIndex) { int recordCount = 0; string empName = txtEmployee.Text.Trim(); DataTable dt; if (string.IsNullOrEmpty(empName)) { dt = DBHelper.readDataFromStoredProc("GetWSPageWise", null, pageIndex, PageSize, out recordCount); } else { dt = DBHelper.readDataFromStoredProc("GetWSPageWiseFilter", empName, pageIndex, PageSize, out recordCount); } dataGridView1.DataSource = dt; PopulatePager(recordCount, pageIndex); // 新增:计算当前页起始行号并填充行表头 int startRowNumber = (pageIndex - 1) * PageSize + 1; populateGridRowHeader(startRowNumber); }
方案2:利用DataBindingComplete事件确保填充时机
若方案1仍存在控件未渲染完成的问题,可通过绑定DataBindingComplete事件,在数据完全绑定后再执行行号填充:
- 在窗体初始化时绑定事件:
public YourForm() { InitializeComponent(); StyleDatagridview(); // 绑定数据绑定完成事件 dataGridView1.DataBindingComplete += DataGridView1_DataBindingComplete; // 首次加载第1页 BindGrid(1); }
- 实现事件处理方法:
// 需提前定义存储当前页码的变量,如_currentPageIndex private int _currentPageIndex = 1; private void DataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) { int startRowNumber = (_currentPageIndex - 1) * PageSize + 1; populateGridRowHeader(startRowNumber); } // 记得在BindGrid和页码点击事件中更新_currentPageIndex private void BindGrid(int pageIndex) { _currentPageIndex = pageIndex; // 原有逻辑... }
补充优化
如果行表头仍有显示异常,可在populateGridRowHeader方法末尾添加强制刷新代码:
private void populateGridRowHeader(int rowNumber) { foreach (DataGridViewRow row in dataGridView1.Rows) { if (row.IsNewRow) continue; row.HeaderCell.Value = rowNumber.ToString(); rowNumber++; } dataGridView1.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders); // 新增:强制刷新行表头 dataGridView1.InvalidateRowHeaders(); }
内容的提问来源于stack exchange,提问作者user3778637
相关产品推荐
相关产品推荐

