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

如何遍历DataView.RowFilter筛选结果并提取每行特定单元格的值

解决DataView筛选后结果的遍历与单元格值提取问题

嘿,我发现你当前的代码里有个小问题:在foreach循环里你一直取dataGridView1.Rows[0],这会导致你永远只拿到第一行的数据,而不是遍历每一行。而且其实不用绕到DataGridView,直接操作DataView本身会更高效、更靠谱,下面给你几个可行的方案:

方案一:直接遍历DataView(推荐,不依赖UI控件)

DataView本身就存储了筛选后的所有行数据,直接遍历它的DataRowView项就可以轻松获取每一行的内容,还能避免UI相关的问题:

private void button1_Click(object sender, EventArgs e)
{
    var dt = sIMSDataSet.Stock;
    var dv = new DataView(dt);
    
    // 优化日期筛选格式,用#包裹日期(ADO.NET标准写法),避免文化差异问题
    string formattedDate = DateTime.Now.ToString("MM/dd/yyyy", System.Globalization.CultureInfo.InvariantCulture);
    dv.RowFilter = $"CheckedOutUntil = #{formattedDate}#";
    
    dataGridView1.DataSource = dv;

    // 遍历DataView的每一行
    foreach (DataRowView rowView in dv)
    {
        // 优先用列名获取值,比索引更直观,也不怕列顺序调整出错
        var date = rowView["CheckedOutUntil"]?.ToString() ?? string.Empty;
        // 把"ItemName"替换成你实际的列名
        var itemName = rowView["ItemName"]?.ToString() ?? string.Empty;
        
        // 这里写你的业务处理逻辑,比如输出、存储等
        Console.WriteLine($"到期日期:{date},物品名称:{itemName}");
    }
}

为什么推荐这个方案?

  • 不依赖DataGridView,即使UI控件没渲染完成,也能正常获取数据
  • 用列名访问比索引更健壮,后续表格列顺序调整不会影响代码
  • 用?.ToString() ?? string.Empty避免了值为null时的空引用异常

方案二:如果一定要遍历DataGridView的行

如果你因为某些原因必须操作DataGridView的行,记得跳过自动生成的空新行(当AllowUserToAddRows为true时,最后一行是空白新行),并且要遍历当前循环的row,而不是固定取第0行:

private void button1_Click(object sender, EventArgs e)
{
    var dt = sIMSDataSet.Stock;
    var dv = new DataView(dt);
    
    string formattedDate = DateTime.Now.ToString("MM/dd/yyyy", System.Globalization.CultureInfo.InvariantCulture);
    dv.RowFilter = $"CheckedOutUntil = #{formattedDate}#";
    
    dataGridView1.DataSource = dv;

    // 遍历DataGridView的每一行,跳过空新行
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        if (!row.IsNewRow)
        {
            // 用当前循环的row获取单元格值,而不是固定Rows[0]
            var date = row.Cells[16].Value?.ToString() ?? string.Empty;
            var itemName = row.Cells[2].Value?.ToString() ?? string.Empty;
            
            // 业务处理逻辑
            Console.WriteLine($"到期日期:{date},物品名称:{itemName}");
        }
    }
}

额外优化建议

  • 尽量避免用单元格索引(比如Cells[16]),改用列名(比如Cells["CheckedOutUntil"]),代码可读性和维护性都会提升
  • 日期筛选时不要直接拼接字符串,用#包裹日期字符串是ADO.NET的标准写法,能避免不同文化下的格式解析错误

内容的提问来源于stack exchange,提问作者James Morrish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:09:41