For Each row As DataGridViewRow In DGV.Rows
DGV.Rows.RemoveAt(CInt(row.Index.ToString))
Next
以上代码将删除所有其他行
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次迭代中作为幻数。
有人可以向我解释这种奇怪吗?
答案 0 :(得分:3)
如果gridview / listbox中有五个项目,无论如何,并删除一个项目,剩下的项目会向上移动:
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
答案 1 :(得分:1)
这里只是一个猜测,但你正在改变你正在迭代的行集合。第一次,您删除索引0处的行。这会将所有行项向上移动一个索引,因此旧索引1现在处于新索引0,剩余249项。第二次通过循环,您将删除索引1处的行,但仍然在索引0处有一行。继续重复,您只能获得一半的项目。
尝试
for n = 0 to dgv.rows.count
dgv.rows.removeat(0)
next
如果你想删除所有内容。
答案 2 :(得分:0)
您对第一个代码示例的断言是错误的。 row.Index已经是一个Integer,你不需要在其上调用ToString,然后将它转换回带有CInt的Int。
如果您确实要删除所有内容,请尝试DGV.Rows.Clear()
答案 3 :(得分: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()