2009-09-21 60 views
1
For Each row As DataGridViewRow In DGV.Rows 
        DGV.Rows.RemoveAt(CInt(row.Index.ToString)) 
       Next 

上面的代码将删除每隔一行这个子程序为什么不工作? (vb.net DataGridView的怪胎)

For i As Integer = 0 To 7 Step 1 
       For Each row As DataGridViewRow In DGV.Rows 
        DGV.Rows.RemoveAt(CInt(row.Index.ToString)) 
       Next 
      Next 

此代码摆脱一切(DGV有,当时的子程序调用,250行)

DGV是显示的DataGridView对象。

我不明白为什么那第一个不会工作。

为了澄清,我用CInt(row.Index.ToString)代替row.Index因为row.Index似乎并没有对自己的工作,但CInt(row.Index.ToString)一样。

我自己也尝试了诸如:

For i As Integer = 0 To DGV.Rows.Count Step 1 
     DGV.Rows.RemoveAt(i) 
    Next 

这也未能奏效。

我甚至在最后一个例子中尝试使用实际数字250代替DGV.Rows.Count,但是结果相同,它总是跳过其他所有代码。我想通过循环遍历几次,我可以清除整个事情,所以我使用了试验和错误,直到我以7次迭代结束为幻数。

有人可以向我解释这种古怪吗?

回答

3

如果你有一个GridView /列表框五个项目,无论和删除的项目外,其余项目动起来:

1 
2 
3 
4 
5 

而成,去除第三项时:

1 
2 
4 
5 

因此,如果从(1,2,3,4,5)中删除第三和第四项,则删除值3和5.

从列表的末尾开始,朝向元素0工作。

for i = list.count - 1 to 0 step -1 
    list.removeAt(i) 
next 
+0

这样做,谢谢! – Cyclone 2009-09-21 23:33:38

1

这里只是一个猜测,但你正在改变你正在迭代的行集合。第一次通过时,您删除索引0处的行。这会将所有行项移动到一个索引,因此旧索引1现在位于新索引0处,剩下249个项目。通过循环第二次,您将删除索引1处的行,但索引0处仍有一行。请继续重复,并且您只会获得一半物品。

尝试

for n = 0 to dgv.rows.count 
    dgv.rows.removeat(0) 
next 

,如果你想删除一切。

0

您对第一个代码示例的断言是错误的。 row.Index已经是一个Integer,你不需要在它上面调用ToString,然后把它转换回带有CInt的Int。

如果你真的要删除一切,尝试DGV.Rows.Clear()

+0

这种方法在这种情况下不起作用,因为我不希望它明确地清楚每一行,这只是我给出的例子。 – Cyclone 2009-09-21 23:34:34

0

您正在改变您遍历集合,所以这不是很奇怪,它不能正常工作。

更令人惊讶的是,您实际上设法在改变集合时迭代集合。对于任何其他集合,枚举器将在您更改集合时失效,但Rows集合似乎工作方式不同。

不过,尽管您在设置集合的同时迭代集合,但它无法正常工作。当您删除索引0处的项目时,下一个项目将占据它的位置。然后,当您继续删除索引1处的项目时,这是最初位于索引2处的项目。当您穿过它们时,集合中的每个第二项都会留下。

要删除的项目一次一个可以循环向后,这样一来当你删除一个项目不影响其他项目的位置:

For i As Integer = DGV.Rows.Count -1 To 0 Step -1 
    Dgv.Rows.RemoveAt(i) 
Next 

您还可以在删除项目指数0,只要有任何物品离开:

While Dgv.Rows.Count > 0 
    Dgv.Rows.RemoveAt(0) 
End While 

但是要去掉所有项目的最简单的方法当然是调用Clear方法:

Dgv.Rows.Clear()