我有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);
}
}
}
答案 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()
您另外将A
与C
进行比较。我没有看到任何理由(采取你对比较愿望的描述)。你可以摆脱它。
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;
}
}
}