【前言】
在优化课程设置这个窗体的时候,虽然通过看别的小伙伴的博客,知道了怎么解决课程重复选择的问题,但是我还是觉得一个一个添加课程太麻烦了,所以就想到了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,与索引的变化一样,所以可行。
Dim i
i = 0
Do While i < listselectcourse.ListCount
If listselectcourse.Selected(i) = True Then
listselectcourse.RemoveItem i
Else
i = i + 1
End If
Loop
这段代码采用的是从前向后遍历,如果被选中就删除,否则i才加1,继续向下检查是否被选中,很正常的思维方