2017-08-24 137 views
0

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

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

我想比较:

1比3,1比4,
2比3,2比4,
3比3,3比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

尝试在内部循环中删除增量语句(i ++;)。你增加你的变量我两次。 – missellorin

+0

嗯,如果我删除它,它不起作用(它只显示值,当我= 0和停止)。 –

+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(); 

与此相比在您若条件:

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

你还用C比较A。我没有看到任何理由(将你的描述作为比较的愿望)。你可以摆脱它。

3)

如果你想改变一个集合的大小(通过删除,通过它你迭代它是明智的使用元素)反向for循环从dataGridView2.RowCount-1开始,一直持续到>= 0 。否则,您可能会遇到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可能会显示额外的空行这也是在这种情况下,你需要从i = dataGridView1.RowCount-2开始计入dataGridView1.RowCount。同样在你找到一个匹配并从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; 
     } 
    } 
} 
+0

错误索引超出范围。必须是非负数,小于集合的大小。参数名称:索引与您的代码:(我尝试反正,但它不工作。我不知道错误代码或视觉?上周,我使用 –

+0

@KateMid我做了一个编辑,以适应这个。看看 –

+0

邑,非常感谢你Mong Zhu.It很好:) :) –