学生信息管理系统—课程设置窗体中怎么一次性添加或删除课程

【前言】

在优化课程设置这个窗体的时候,虽然通过看别的小伙伴的博客,知道了怎么解决课程重复选择的问题,但是我还是觉得一个一个添加课程太麻烦了,所以就想到了Listbox还有第二种样式,就是复选框样式。我想能不能一下子先选完课程,再通过点击那个添加按钮,全部添加到右边的那个列表框里呢?这样应该会方便用户。

【正文】

首先我们先来了解一下listboxselected属性,这个属性就是专门用于复选框样式的,记录了列表中的选项是否被选中,取值为truefalse。例: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,与索引的变化一样,所以可行。
还有一种方法,用的是do while……loop循环,
	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,继续向下检查是否被选中,很正常的思维方
式,可是我却没想到这样改。而我之前是不管有没有选中,只要循环一次i就加1,所以会出错。
上面提到的用循环可能不太好,所以还可以用另一种方法,避开这个问题。我们可以在把课程添加到右面的列表
框的 时候,同时把左边选中的课程删除,这样就不用判断课程重复选择了,这种方法也可行,但是编写的sql语句要不
同, 有兴趣的小伙伴可以试试。
【总结】
当我们遇到一个问题时,如果这个方法行不通,可以换个角度思考一下,比如用对称的思想,从前向后遍历不行
就试试从后向前遍历,这让我想到了米老师当初讲算法的时候讲的对称。可能我们遇到问题大多数情况下,首先想到
的是用正常的思维去解决,可是有时候正常不一定能解决,这个时候我们就可以转换一下思维方式,比如翻转一下。
我们经常见到的一些益智的题,就是要锻炼我们这种思维方式。通过这次的问题,我感觉到算法真是太神奇了,我们
还要多多积累,开发大脑。

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...