比较2 datagridview c#之间的值

时间:2017-08-24 06:25:00

标签: c# datagridview

我有2个datagridviews。 dataGridView1有3行,dataGridView2有2行。如何比较它们之间的值。

Exa: Datagridview1          Datagridview2    
Id name                     Id name
1  A                        3   C
2  B                        4   A
3  C

我想比较一下:

  

1 vs 3,1 vs 4,
  2 vs 3,2 vs 4,
  3 vs 3,3 vs. 4。

我使用下面的代码,但它的工作原理不正确。

for (int i = 0; i < dataGridView1.RowCount; i++)
{
    for (int j = 0; j < dataGridView2.RowCount; j++)
    {   
        i++;
        string grid2 = dataGridView2.Rows[j].Cells[1].Value.ToString();
        string grid1 = dataGridView1.Rows[i].Cells[1].Value.ToString();
        if (grid1 == grid2 || dataGridView2.Rows[0].Cells[1].Value.ToString() == dataGridView1.Rows[0].Cells[1].Value.ToString() )
        {
            dataGridView1.Rows.RemoveAt(i);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

1)

如果你想使用for循环迭代一个集合,那么在代码中用这一行增加索引变量是不明智的:

i++;

它已经增加了。因此,当您浏览dataGridView2时,您实际上还会在dataGridView1中进一步滑动一个位置。这不是你想要的(正如我在你的帖子中看到你描述所需的比较)。您需要删除此行

<强> 2)

  

我想比较:1对3,1对4,2对3,2对4,3对3,3对4。

如果您只想比较name列,那么您的索引是正确的:

dataGridView2.Rows[j].Cells[1]

但是如果你想比较Id列那么它是错误的,因为索引以0开头。因此,要从Id列中获取正确的值,您必须使用它:

string grid2 = dataGridView2.Rows[j].Cells[0].Value.ToString();

在if条件中进行比较:

 dataGridView2.Rows[0].Cells[1].Value.ToString() == dataGridView1.Rows[0].Cells[1].Value.ToString()

您另外将AC进行比较。我没有看到任何理由(采取你对比较愿望的描述)。你可以摆脱它。

3)

如果要更改通过其迭代的集合的大小(通过删除元素),则明智的做法是使用从dataGridView2.RowCount-1开始并运行到>= 0的反向for循环。否则,您可能会遇到ArgumentOutOfBounds异常,因为您在删除后没有像启动循环时那样多的元素。结束索引处的元素将不再存在。

for (int i = dataGridView1.RowCount-1; i >= 0 ; i--)
{
    for (int j = 0; j < dataGridView2.RowCount; j++)
    {   
        string grid2 = dataGridView2.Rows[j].Cells[0].Value.ToString();
        string grid1 = dataGridView1.Rows[i].Cells[0].Value.ToString();
        if (grid1 == grid2)
        {
            dataGridView1.Rows.RemoveAt(i);
        }
    }
}

编辑:

dataGridView1可能会显示一个额外的空行,该行也会计入dataGridView1.RowCount,在这种情况下,您需要从i = dataGridView1.RowCount-2开始。此外,在找到匹配项并从dataGridView1中删除该行后,进一步搜索此行的匹配项是没有意义的,因为它已经消失了。所以你应该打破内循环并继续下一行:

for (int i = dataGridView1.RowCount - 2; i >= 0; i--)
{
    for (int j = 0; j < dataGridView2.RowCount -1; j++)
    {
        string grid2 = dataGridView2.Rows[j].Cells[0].Value.ToString();
        string grid1 = dataGridView1.Rows[i].Cells[0].Value.ToString();
        if (grid1 == grid2)
        {
            dataGridView1.Rows.RemoveAt(i);
            break;
        }
    }
}