C#中DataGridView非空单元格计数及分段执行需求问询
C# DataGridView非空单元格统计与分段触发实现
核心实现方案
1. 统计非空单元格数量
提供两种实现方式,按需选择:
- 循环遍历(兼容所有.NET版本):
int CountNonEmptyCells(DataGridView dgv, int columnIndex) { int counter = 0; foreach (DataGridViewRow row in dgv.Rows) { // 排除默认新行,同时过滤空值与空字符串 if (!row.IsNewRow && row.Cells[columnIndex].Value != null && !string.IsNullOrWhiteSpace(row.Cells[columnIndex].Value.ToString())) { counter++; } } return counter; }
- LINQ简化写法(.NET 3.5+):
int CountNonEmptyCells(DataGridView dgv, int columnIndex) { return dgv.Rows.Cast<DataGridViewRow>() .Where(row => !row.IsNewRow && row.Cells[columnIndex].Value != null && !string.IsNullOrWhiteSpace(row.Cells[columnIndex].Value.ToString())) .Count(); }
注:空值判断逻辑可根据业务需求调整,比如是否需要处理
DBNull类型。
2. 分段触发逻辑实现
要实现“每25行触发一次停止”的需求,需在Form类中维护一个触发阈值状态变量,确保多次执行操作时能保留进度:
// Form类级别字段,保存下一次触发的阈值 private int _nextTriggerThreshold = 25; private CancellationTokenSource _cts; // 填充数据的核心方法 private void FillData() { _cts = new CancellationTokenSource(); buttonStart.Enabled = true; // 先统计当前已填充的非空单元格数量 int currentNonEmptyCount = CountNonEmptyCells(dataMailist, 2); // 从当前已填充行的下一行开始继续填充 for (int i = currentNonEmptyCount; i < 100; i++) // 假设总填充目标是100行 { if (_cts.Token.IsCancellationRequested) break; // 替换为你的实际数据填充逻辑 dataMailist.Rows[i].Cells[2].Value = "填充内容"; currentNonEmptyCount++; // 检查是否达到触发阈值 if (currentNonEmptyCount == _nextTriggerThreshold) { buttonStart.Enabled = false; dataMailist.Rows[i].Cells[2].Value = "Limit"; _cts.Cancel(); // 更新下一次触发的阈值 _nextTriggerThreshold += 25; break; } } }
3. 重置逻辑(可选)
如果需要重置触发进度,重新从25开始计数,可添加以下方法:
private void ResetTriggerProgress() { _nextTriggerThreshold = 25; }
关键说明
- 状态持久化:若需要程序重启后保留触发进度,可将
_nextTriggerThreshold的值写入本地配置文件(如App.config),启动时读取恢复。 - 性能优化:填充过程中实时更新
currentNonEmptyCount,避免重复遍历整个DataGridView统计,提升执行效率。 - 边界处理:若总填充行数不足下一个阈值(比如最后一次填充到90行,下一个阈值是100),则会完成剩余行的填充,不会触发停止逻辑。
内容的提问来源于stack exchange,提问作者Oleg
相关产品推荐
相关产品推荐

