回 帖 发 新 帖 刷新版面

主题:[讨论]求助:DataGridView 删除条件行问题?

在一个 DataGridView 中,想删除第5列单元格中的值不为5的所有行,代码如下:
....
        DataGridView1.AllowUserToDeleteRows = True   '允许编辑
        DataGridView1.AllowUserToAddRows = False     '不允许添加最后新行

        Dim i As Integer
        For i = 0 To DataGridView1.RowCount - 1
            If Val(DataGridView1.Rows(i).Cells(4).Value) <> 5 Then 如果此行的第5列单元格数据不为5,
                DataGridView1.Rows.RemoveAt(i)    '删除该行___有出错提示
            End If
        Next

....

问题是:
       总是提示出错:"索引超出范围",结果无法删除!
   
    但如果将   DataGridView1.Rows.RemoveAt(i) 
    改写成:
               DataGridView1.Rows(i).Selected = True  '选择这些行  __ 无出错提示
   则没有任何错误提示,而且能正确选择!

   请问:问题出在哪? 望高手指点!

回复列表 (共4个回复)

沙发

我不保证我的答案一定正确,但你可以参考一下,因为我以前也遇到过类似的问题:
    你的for循环中使用DataGridView1.RowCount 是不正确的,因为for循环只在第一次执行前计算该部分,随后无论RowCount怎么变化,都不会再影响到for循环的执行次数,显然随着循环内不停的删除记录,实际上DataGridView1中的记录数不一定是RowCount.
    有一个简单的例子:如果一开始有两条记录,那么用你上面的代码,它一定会执行两次,这时如果第一条记录满足了你的删除条件而被删除,可下一次执行时循环变量为2,而你删除了第一条记录后的DataGridView1中只剩下了一条记录,所以会通知你索引超出了界限.
    实际上不止在此处,但凡涉及针对集合元素的迭代操作中如果用你这种思路都会出问题,你可以考虑其他的实现方法!!!!

    你滴~明白乎?????

板凳


感谢回复
不知道同样的环境下完成这项工作(删除指定行)有没有什么更好的办法,或者将这个思路改进一下?.

3 楼


不好意思,这么长时间了都,我不常上网,这个问题你可能早解决了吧?可改用do-while循环呀?

4 楼


  推荐给Web程序员
 
  [url=http://www.888RMB.com.cn] www.888RMB.COM.CN[/url] 为中国赚钱网站。 提供网络赚钱教程、络赚赚钱经验、络赚赚钱秘籍、络赚赚钱项目、络赚赚钱产品, 为想赚钱的人群提供一个赚钱的网络平台!

我来回复

您尚未登录,请登录后再回复。点此登录或注册