【前言】
在优化课程设置这个窗体的时候,虽然通过看别的小伙伴的博客,知道了怎么解决课程重复选择的问题,但是我还是觉得一个一个添加课程太麻烦了,所以就想到了ListBox还有第二种样式,就是复选框样式。我想能不能一下子先选完课程,再通过点击那个添加按钮,全部添加到右边的那个列表框里呢?这样应该会方便用户。
【正文】
首先我们先来了解一下listBox的selected属性,这个属性就是专门用于复选框样式的,记录了列表中的选项是否被选中,取值为true或false。例:list1.selected(3)=true表明列表框list1中的第4项被选中。
其实我一开始也分不清listindex属性和list属性,通过看VB书,我知道了它们两个的区别。
List.listindex返回的是索引值,是一个数值。
List.list()返回的是选中的内容,是一个字符串。
好了,明白了这几个属性,接下来研究代码就容易多了。我经过对原来那一段不能让用户重复选择课程的代码的修改,终于行得通了,当然也不是一次就成功了,也是经过了几次才改成功的,具体怎么修改的过程我忘记了。鉴于这一段代码比较容易修改,我就让大家直接看一下代码吧。我用的是循环遍历,其中用到了两次for循环,采用了循环嵌套。其实我觉得这样不太好,也就是这个程序比较小,循环的次数相对较少,如果是大程序,我不建议用这用方法,占用内存大还耗费时间,但是我暂时没有找到更好的办法,也就先这样了。当然如果解决的话,也有其他的办法,到最后我再说一下思路。
Private Sub cmdAdd_Click() ' Dim i As Variant ' If listallcourse.ListIndex <> -1 Then ' If listselectcourse.ListCount = 0 Then ' listselectcourse.AddItem listallcourse.List(listallcourse.ListIndex) ' End If ' For i = 0 To listselectcourse.ListCount - 1 ' If listallcourse.List(listallcourse.ListIndex) = listselectcourse.List(i) Then ' Exit Sub ' End If ' Next ' listselectcourse.AddItem listallcourse.List(listallcourse.ListIndex) ' End If Dim i As Variant Dim j As Variant For i = 0 To listallcourse.ListCount - 1 If listallcourse.Selected(i) Then If listselectcourse.ListCount = 0 Then listselectcourse.AddItem listallcourse.List(i) Else For j = 0 To listselectcourse.ListCount - 1 If listallcourse.List(i) = listselectcourse.List(j) Then MsgBox "您选择的课程有些已经添加,请重新检查!",vbOKOnly + vbExclamation,"提示" Exit Sub End If Next listselectcourse.AddItem listallcourse.List(i) End If End If Next End Sub上面被注释掉的代码就是防止课程重复添加的代码,我就是根据这段代码修改的,大家可以比较一下。
接下来,另一个问题,右边的列表框怎么一次性删除所选的课程呢?这个问题,我一开始始终没有想到,最后才
万不得已上网查询了一下。这个过程我记得比较清晰,让我来说一下解决的过程吧。
一开始我用的是下面这段代码,即从前向后遍历,但是运行的时候,和我想要的结果不一样,出现了问题。
Private Sub cmdDelete_Click() Dim i As Long For i = 0 To listselectcourse.ListCount - 1 If listselectcourse.Selected(i) = True Then listselectcourse.RemoveItem (i) '删除选中项 End If Next End Sub当我选定了要删除的课程,点击删除按钮时,却出现了下面的问题。
我选择调试,仔细查看了变量的值才明白为什么会出现这种错误,见下图。
原来代码中的显示的索引是3,而列表框中数据总共才三条,索引最大才是2,所以显示无效的索引。那么为什
么会这样呢?因为在代码运行时,每循环一次,i就会加1,而列表框中每删除一条,索引就减1,结果索引就会超出
范围而报错。看起来有点像南辕北辙,哈哈!我一直想着怎么改代码能解决这个问题,却没意识到这个方法本身就是
错误的,所以无论怎么改都不能达到要求。无奈之下,我上网搜索了一下,发现了两种办法。下面我展示一下代码。
Dim i As Variant For i = listselectcourse.ListCount - 1 To 0 Step -1 If listselectcourse.Selected(i) = True Then listselectcourse.RemoveItem (i) '删除选中项 End If Next这段代码,运用的也是for循环,不过与之前不同的是,这段代码采用的是从后向前遍历,结果就能实现,看起来如此小小的变化,作用却大不相同。这段代码的意思是每删除一项,i减1,与索引的变化一样,所以可行。 原文链接:https://www.f2er.com/vb/256436.html