删除listbox指定项出错!请指教~
vb.net吧
全部回复
仅看楼主
level 1
okaygirl520 楼主
我想删除listbox2中所有与textbox1字符长度不一样的项,使用如下代码报错,请帮忙!
For i = 0 To ListBox2.Items.Count - 1
If Len(ListBox2.Items.Item(i).ToString) <> Len(TextBox1.Text) + 2 Then
ListBox2.Items.Remove(ListBox2.Items.Item(i).ToString)
End If
Next
2014年12月15日 09点12分 1
level 12
ListBox2.Items.Remove(ListBox2.Items.Item(i).ToString)
改为:
ListBox2.Items.Remove(ListBox2.Items.Item(i))
或者用:
ListBox2.Items.RemoveAt(i)
2014年12月16日 01点12分 2
一样的出错,不知是为啥。
2014年12月16日 05点12分
回复 okaygirl520 :你报错的地方是那里?
2014年12月16日 05点12分
回复 杭州北极熊 :If Len(ListBox2.Items.Item(i).ToString) <> Len(TextBox1.Text) + 2 Then 这句报错!
2014年12月16日 05点12分
回复 杭州北极熊 :报错的截图在下面
2014年12月16日 05点12分
level 1
okaygirl520 楼主
我的代码如下:执行后最后listbox2中就只剩下"abcd"和"bnte"
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TextBox1.Text = "ge"
With ListBox2
.Items.Add("abcd123")
.Items.Add("abcd")
.Items.Add("dfer")
.Items.Add("abcd56")
.Items.Add("abcd896")
.Items.Add("bnte")
.Items.Add("abcd667889")
End With
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
For i = 0 To ListBox2.Items.Count - 1
If Len(ListBox2.Items.Item(i).ToString) <> Len(TextBox1.Text) + 2 Then
ListBox2.Items.Remove(ListBox2.Items.Item(i))
'ListBox2.Items.RemoveAt(i)
End If
Next
End Sub
End Class
2014年12月16日 05点12分 3
level 1
okaygirl520 楼主
2014年12月16日 05点12分 4
level 12
重新对你的这个代码看了一下,问题是在出面这个控件删除逻辑上。
你在用For 对这个ListBox2控件进行循环的时候,进行了这个删除的操作,这个是不允许的。
比如:
原来记录是5条,循环 到第一条的时候要去删除它,OK ,删除成功后记录数就只有4条了,可是当你继续跑,不管后面还有没有删除操作,ListBox2的控件记录数就被修改了4条,所以到你i=4的时候,软件就会报错了。
所以For 循环这里你不能删除,你只能先用一个变量保存要删除的记录行,然后再用一个For 倒过来去删除刚刚保存的变量行数,注意是倒过来循环,不然删除的记录就是一个错误的。
2014年12月16日 06点12分 5
level 1
okaygirl520 楼主
谢谢你帮我分析!我改了下,先判断不需要的项将其删除,然后重新再将符合条件的项重新写回listbox,但是结果没有达到要求,请帮我再看看下面的代码,哪有问题,我是刚学习listbox这个控件,请多多指教!
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim NewList As New ArrayList
For i = 0 To ListBox2.Items.Count - 1
If Len(NewList.Contains(ListBox2.Items.Item(i).ToString)) <> Len(TextBox1.Text) + 2 Then
NewList.Remove(ListBox2.Items.Item(i))
End If
Next
ListBox2.Items.Clear()
For i = 0 To NewList.Count - 1
ListBox2.Items.Add(NewList(i))
Next
End Sub
2014年12月16日 07点12分 6
level 12
Dim NewList As New ArrayList
你对这个new 的变量在那里进行了付值?
NewList.Remove(ListBox2.Items.Item(i))
你这里是移除。
NewList.Add(ListBox2.Items.Item(i))
2014年12月16日 07点12分 7
我是想先从listbox2中移除不符合要求的项,然后再将符合项保留在listbox2里。那代码该如何改啊,刚接触这控件,求教!
2014年12月16日 08点12分
回复 okaygirl520 :那你应该初始NewList数值的时候,先给这个数组符值,值的内容和排序和ListBox2一样,这样你就可以用ewList.Remove,NewList全局定义,不要在Button1_Click事件里进行New操作。
2014年12月16日 08点12分
level 12
Dim NewList As New ArrayList
For i = 0 To ListBox2.Items.Count - 1
If Len(NewList.Contains(ListBox2.Items.Item(i).ToString)) <> Len(TextBox1.Text) + 2 Then
NewList.add(i)
End If
Next
For i = 0 To NewList.Count - 1
ListBox2.Items.RemoveAt(NewList(i)))
Next
把要删除的行保存到NewList里面,
全部检索完了后再循环一次NewList,然后一条条的删除。
2014年12月16日 09点12分 8
level 1
okaygirl520 楼主
使用了全局变量,代码如下,还是不行!晕~[汗]
Public Class Form1
Dim NewList As New ArrayList
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TextBox1.Text = "ge"
With ListBox2
.Items.Add("abcd123")
.Items.Add("abcd")
.Items.Add("dfer")
.Items.Add("abcd56")
.Items.Add("abcd896")
.Items.Add("bnte")
.Items.Add("abcd667889")
End With
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
For i = 0 To ListBox2.Items.Count - 1
If Len(NewList.Contains(ListBox2.Items.Item(i).ToString)) <> Len(TextBox1.Text) + 2 Then
NewList.Add(i)
End If
Next
For i = 0 To NewList.Count - 1
ListBox2.Items.RemoveAt(NewList(i))
Next
End Sub
End Class
麻烦帮再看看呀!!!
2014年12月16日 09点12分 9
level 1
okaygirl520 楼主
top
2014年12月18日 00点12分 10
level 5
当然会报错,你的
For i = 0 To NewList.Count - 1
ListBox2.Items.RemoveAt(NewList(i))
Next
i 每循环一遍, ListBox2.Items的值就递减一位,但是你之前获取ListBox2.Items的值是固定的,后面减少的值你没有计算,肯定会超出索引的。
2014年12月18日 07点12分 11
level 5
这里不应该使用移除索引,因为每次移除后ListBox2.Items就会刷新.Items的值,如果不考虑删除重复值得话,可以使用Remove,下面的代码
For i = 0 To ListBox2.Items.Count - 1
Dim _K As Integer = Len(NewList.Contains(ListBox2.Items.Item(i).ToString))
Dim _L As Integer = Len(TextBox1.Text) + 2
If _K <> _L Then
NewList.Add(ListBox2.Items.Item(i).ToString)
End If
Next
Dim _S As Integer = NewList.Count
For i = 0 To _S - 1
ListBox2.Items.Remove(NewList.Item(i).ToString)
Next
2014年12月18日 07点12分 12
是啊,奇怪!数据都清空了。我测试了下,不行啊!能帮再看看吗?
2014年12月19日 02点12分
level 1
okaygirl520 楼主
自己琢磨了下,还是换个思维,先把符合要求的项写到临时listbox中,然后再利用addrange获得临时listbox的项,代码如下!谢谢各位!
Dim TempItems As New ListBox
For i As Integer = 0 To ListBox2.Items.Count - 1
If Len(ListBox2.Items.Item(i).ToString) = Len(TextBox1.Text) + 2 The
TempItems.Items.Add(ListBox2.Items.Item(i).ToString)
End If
Next
ListBox2.Items.Clear()
ListBox2.Items.AddRange(TempItems.Items)
2014年12月19日 05点12分 13
level 5
For i = 0 To ListBox2.Items.Count - 1
Dim _N As Integer = ListBox2.Items(i).ToString.Length
'错在这句上 Len(NewList.Contains(ListBox2.Items(i).ToString))
Dim _L As Integer = Len(TextBox1.Text) + 2
If _N <> _L Then
NewList.Add(ListBox2.Items.Item(i).ToString)
End If
Next
Dim _S As Integer = NewList.Count
For i = 0 To _S - 1
ListBox2.Items.Remove(NewList.Item(i).ToString)
Next
2014年12月19日 05点12分 14
嗯,有时换个逻辑可可以实现同杨的功能。
2014年12月19日 09点12分
level 11
好深奥啊
2014年12月21日 21点12分 15
level 4
不能在循环中直接删除元素。这会造成循环到那个被删掉了已经不存在的位置,出错。思路很简单,循环找到符合条件的记录,循环结束后再逐个删除。
2015年01月14日 17点01分 16
level 10
楼上诸位搞得太复杂了,这个问题其实很简单,倒序循环就可以了
For i = ListBox2.Items.Count - 1 to 0 step -1
If Len(NewList.Contains(ListBox2.Items.Item(i).ToString)) <> Len(TextBox1.Text) + 2 Then
NewList.Remove(ListBox2.Items.Item(i))
End If
Next
2015年01月16日 06点01分 18
1