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

前端之家收集整理的这篇文章主要介绍了学生信息管理系统—课程设置窗体中怎么一次性添加或删除课程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

【前言】

在优化课程设置这个窗体的时候,虽然通过看别的小伙伴的博客,知道了怎么解决课程重复选择的问题,但是我还是觉得一个一个添加课程太麻烦了,所以就想到了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语句要不
同, 有兴趣的小伙伴可以试试。
【总结】
当我们遇到一个问题时,如果这个方法行不通,可以换个角度思考一下,比如用对称的思想,从前向后遍历不行
就试试从后向前遍历,这让我想到了米老师当初讲算法的时候讲的对称。可能我们遇到问题大多数情况下,首先想到
的是用正常的思维去解决,可是有时候正常不一定能解决,这个时候我们就可以转换一下思维方式,比如翻转一下。
我们经常见到的一些益智的题,就是要锻炼我们这种思维方式。通过这次的问题,我感觉到算法真是太神奇了,我们
还要多多积累,开发大脑。
原文链接:https://www.f2er.com/vb/256436.html

猜你在找的VB相关文章