为什么这个子程序不起作用? (vb.net DataGridView奇怪)

时间:2009-09-21 23:20:02

标签: vb.net datagridview

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次迭代中作为幻数。

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

4 个答案:

答案 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()