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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:46:00