一个有关listview的问题,一直没解决,急!

Dublue 2003-09-11 08:32:59
偶最近用VB6.0写程序,使用ListView控件时遇到一个问题:偶打算将一个lv控件中的某列值copy到另一个lv控件中,使用for循环时出现了控件陷井错——编号:35600,常量:ccIndexOutOfBounds,解释:边界溢出。不知谁能详细解释一下此错误根源何在?该如何解决?附源码片断如下:
For i = 1 To lvRange1.ListItems.Count
If lvRange1.ListItems(i).Selected = True Then
j = j + 1
lvRange2.ListItems.Add j, , lvRange1.ListItems(i).Text
lvRange1.ListItems.Remove i
End If
Next
...全文
113 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dublue 2003-09-14
  • 打赏
  • 举报
回复
哦,搞定了,谢谢各位;)
揭帖
Ranma_True 2003-09-13
  • 打赏
  • 举报
回复
当然溢出了,你删掉一行后,总行数就减去一行了。
lgxysl 2003-09-13
  • 打赏
  • 举报
回复
问题解决了要给分呀,楼主。
chenkangli 2003-09-12
  • 打赏
  • 举报
回复
For i = 1 To lvRange1.ListItems.Count
If lvRange1.ListItems(i).Selected = True Then
j = j + 1
lvRange2.ListItems.Add j, , lvRange1.ListItems(i).Text
lvRange1.ListItems.Remove i-1
End If
Next
lgxysl 2003-09-12
  • 打赏
  • 举报
回复
不好意思,最近老是打错字,将上复回更正如下:

出错的原因是你用了lvRange1.ListItems.Remove i ,这将把你的第i行删除,假定lvRange1原来有10行,那么删除了一行之后,lvRange1.ListItems.Count就变成9了,但i并没有循环到9结束(尽管lvRange1.ListItems.Count=9),而是仍然到10(这也许是循环开始后,循环终值就已经确定了,不会随lvRange1.ListItems.Count的改变而改变,这样index就越界了。
解决的办法有两个,其一是:

On Error Resume Next '进行错误处理,跳过错误。
For i = 1 To lvRange1.ListItems.Count
If lvRange1.ListItems(i).Selected = True Then
j = j + 1
lvRange2.ListItems.Add j, , lvRange1.ListItems(i).Text
lvRange1.ListItems.Remove i
End If
Next

其二是:
For i = 1 To lvRange1.ListItems.Count
If lvRange1.ListItems(i).Selected = True Then
j = j + 1
lvRange2.ListItems.Add j, , lvRange1.ListItems(i).Text
lvRange1.ListItems.Remove i
exit for '跳出循环,建议使用这种方法,找到了就结束,不要再做无为的循环了。
End If
Next

用上面这两种方法,问题肯定会得到解决,请给分呀,我等分用。

补充:
有网友 huangguanshu() 提出这种方法
For i = 1 To lvRange1.ListItems.Count
If lvRange1.ListItems(i).Selected = True Then
j = j + 1
lvRange2.ListItems.Add j, , lvRange1.ListItems(i).Text
lvRange1.ListItems.Remove i
End If
Next
lvRange1.ListItems.Remove i
从这位网友的出发点来说这也是基本正确的,但lvRange1.ListItems.Remove i 不能再留在循环体内了还要注意,你必须显式声明i变量,如dim i as integer
一般来说,for 循环循环变量是不会带出循环体的,所以应该改成这样:
dim iok as integer
For i = 1 To lvRange1.ListItems.Count
If lvRange1.ListItems(i).Selected = True Then
iok=i
j = j + 1
lvRange2.ListItems.Add j, , lvRange1.ListItems(i).Text
End If
Next
lvRange1.ListItems.Remove iok
(但要说比较好的话,还是我的第二种方法比较好,listview控件的当前选定行只有一行是唯一的,找到了就OK了,还向下找干什么,假如你有10000行,而你选定的是第2行,那你就要多选99998行,看看,多无唯!)

windcandle 2003-09-12
  • 打赏
  • 举报
回复
For i = lvRange1.ListItems.Count to 1 step -1
If lvRange1.ListItems(i).Selected = True Then
j = j + 1
lvRange2.ListItems.Add j, , lvRange1.ListItems(i).Text
lvRange1.ListItems.Remove i
End If
Next
逆向处理就没有问题了。
射天狼 2003-09-12
  • 打赏
  • 举报
回复
循环变量 i 越来越大,而你删除了之后会越来越少,当然溢出了,所以要倒着循环,这样才不会出错~~
射天狼 2003-09-12
  • 打赏
  • 举报
回复
For i = lvRange1.ListItems.Count To 1 Step -1
If lvRange1.ListItems(i).Selected = True Then
j = j + 1
lvRange2.ListItems.Add j, , lvRange1.ListItems(i).Text
lvRange1.ListItems.Remove i
End If
Next
lgxysl 2003-09-12
  • 打赏
  • 举报
回复
"For i = 1 To lvRange1.ListItems.Count
If lvRange1.ListItems(i).Selected = True Then
j = j + 1
lvRange2.ListItems.Add j, , lvRange1.ListItems(i).Text
lvRange1.ListItems.Remove i-1
End If
Next"
这位仁兄真搞笑,人家要删第i行,你为什么给删第i-1行。错得更多。
szyhy810518 2003-09-12
  • 打赏
  • 举报
回复
dim lngCount as Long '设置一个动态的循环中止变量
lngCount = lvRange1.ListItems.Count

For i = 1 to lngCount
If lvRange1.ListItems(i).Selected = True Then
j = j + 1
lvRange2.ListItems.Add j, , lvRange1.ListItems(i).Text
lvRange1.ListItems.Remove i
lngCount = lngCount - 1
End If
Next
zhouqi66 2003-09-12
  • 打赏
  • 举报
回复
删的时侯倒着删啊
lxcc 2003-09-12
  • 打赏
  • 举报
回复
倒着删
yijiansong 2003-09-12
  • 打赏
  • 举报
回复
逆向处理
lgxysl 2003-09-11
  • 打赏
  • 举报
回复
出错的原因是你用了lvRange1.ListItems.Remove i ,这将把你的每i等删除,假定lvRange1原来有10行,那么删除了一行之后,lvRange1.ListItems.Count就变成9了,但i并没有循环到9结束(尽管lvRange1.ListItems.Count=9),而是仍然到10(这也许是循环开始后,循环终值就已经确定了,不会随lvRange1.ListItems.Count的改变而改变,这样index就越界了。
解决的办法有两个,其一是:

On Error Resume Next '进行错误处理,跳过错误。
For i = 1 To lvRange1.ListItems.Count
If lvRange1.ListItems(i).Selected = True Then
j = j + 1
lvRange2.ListItems.Add j, , lvRange1.ListItems(i).Text
lvRange1.ListItems.Remove i
End If
Next

其二是:
For i = 1 To lvRange1.ListItems.Count
If lvRange1.ListItems(i).Selected = True Then
j = j + 1
lvRange2.ListItems.Add j, , lvRange1.ListItems(i).Text
lvRange1.ListItems.Remove i
exit for '跳出循环,建议使用这种方法,找到了就结束,不要再做无为的循环了。
End If
Next

用上面这两种方法,问题肯定会得到解决,请给分呀,我等分用。

补充:
有网友 huangguanshu() 提出这种方法
For i = 1 To lvRange1.ListItems.Count
If lvRange1.ListItems(i).Selected = True Then
j = j + 1
lvRange2.ListItems.Add j, , lvRange1.ListItems(i).Text
lvRange1.ListItems.Remove i
End If
Next
lvRange1.ListItems.Remove i
从这位网友的出发点来说这也是正确的,但要注意,你必须显式声明i变量,如dim i as integer
一般来说,for 循环循环变量是不会带出循环体的,所以最好改成这样:
dim iok as integer
For i = 1 To lvRange1.ListItems.Count
If lvRange1.ListItems(i).Selected = True Then
iok=i
j = j + 1
lvRange2.ListItems.Add j, , lvRange1.ListItems(i).Text
lvRange1.ListItems.Remove i
End If
Next
lvRange1.ListItems.Remove iok
(但要说比较好的话,还是我的第二种方法比较好,listview控件的当前选定行只有一行是唯一的,找到了就OK了,还向下找干什么,假如你有10000行,而你选定的是第2行,那你就要多选99998行,看看,多无唯!)


northwolves 2003-09-11
  • 打赏
  • 举报
回复
j=1
For i = 1 To lvRange1.ListItems.Count
If lvRange1.ListItems(i).Selected = True Then
lvRange2.ListItems.Add j, , lvRange1.ListItems(i).Text
lvRange1.ListItems.Remove i
j = j + 1
End If
Next
kyuwong 2003-09-11
  • 打赏
  • 举报
回复
For i = 1 To lvRange1.ListItems.Count
If lvRange1.ListItems(i).Selected = True Then
j = j + 1
lvRange2.ListItems.Add j, , lvRange1.ListItems(i).Text
lvRange1.ListItems.Remove i
End If
Next
lvRange1.ListItems.Remove i
你这里删除一项,也就是最后,i=lvRange1.ListItems.Count肯定会越界。
试一试这个
For i = 1 To lvRange1.ListItems.Count
If lvRange1.ListItems(1).Selected = True Then '这里是1
j = j + 1
lvRange2.ListItems.Add j, , lvRange1.ListItems(1).Text'这里是1
lvRange1.ListItems.Remove 1'这里是1
End If
Next
Dublue 2003-09-11
  • 打赏
  • 举报
回复
不是吧,listitems集合是从1算起的。而且无论哪种写法,均会报错。怪?
AustinLei 2003-09-11
  • 打赏
  • 举报
回复
ListItems从编号0开始,改为:
For i = 0 To lvRange1.ListItems.Count-1
If lvRange1.ListItems(i).Selected = True Then
j = j + 1
lvRange2.ListItems.Add j, , lvRange1.ListItems(i).Text
lvRange1.ListItems.Remove i
End If
Next

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧