4.8 列表框与组合框

利用列表框可以直观地选择所需要的项目,而组合框可以把一个文本框和列表框组合为一个整体控件。在编程时如果要给用户一种直观的选择,可以使用列表框;当窗体空间很紧张的时候,因为列表框会占据很大的空间,所以这时采用组合框较好。

4.8.1 列表框介绍

列表框用来让用户从中选择所需要的项目。如果有多种选项让用户选择,使用列表框是个不错的方案。比如,Word2003的“主题”对话框内,列出所有可选主题的区域就是一个列表框控件,如图4.16所示。又例如聊天室软件的界面内列出所有聊天室成员的控件也是列表框。Visual Basic给列表框起的默认名字是List1、List2、List3⋯等。

图4.16 列表框

4.8.2 列表框的常用属性

列表框除了拥有大部分控件的通用属性以外还有如下几个常用属性。

1. Columns属性

该属性用来确定列表框的列数。其取值含义如下。

❑设置为0:(默认值)以单列显示。如果项目的条数较多,在列表框中显示不下时,自动出现垂直滚动条。

❑设置为1到n:多列显示。先填第一列,再填第二列,以此类推。ListBox水平滚动并显示指定数目的列。

2. List属性

该属性在设计时,可以通过属性窗口为列表框添加内容。同时也可以在程序中提取列表项的内容和设置列表项的内容。通过程序语句引用列表项内容的通用格式为:

        列表框. List(索引号)

其中,索引号为列表项的序号。列表项的序号从0开始。因此,列表框第一条列表项的序号(索引号)为0,依次类推。

例如:假设列表框List1中的内容如图4.17所示。

图4.17 列表框

        s=List1.List(3)

上面表达式的含义为:将列表框List1的第4项的内容“桔子”赋值给变量s。又如,

        List1.List(0)="葡萄"

含义为:将列表框List1的第1项的内容“苹果”改为“葡萄”。

技巧

当在属性窗口中使用List属性为列表框添加项目时,在List的下拉编辑器里如果要换行可以使用Ctrl+回车来避免每次回车都会关闭编辑器的问题。

List属性其实是数组。数组可以被简单理解成拥有同一个名字的变量的组合,每一个变量称为数组中的元素。其后跟随的圆括号内的数值称为下标,在程序中通过下标来区分数组中具体的元素。关于数组详细的知识在本书的第6章讲解。

3. ListCount属性

该属性中存放列表框中列表项的项数(条数)。列表框中各列表项的排列从0开始,最后一项的序号为ListCount-1。例如语句:

        MsgBox   List1.ListCount

的作用是将列表框List1的总项数显示到了一个消息框中。

4. ListIndex属性

该属性的设置值是已选中的表项的位置。表项位置由索引值指定,第1项的索引值为0,第2项为1,依次类推。如果没有选中任何项,ListIndex的值将设置为-1。在程序中设置ListIndex后,被选中的条目反相显示。例如执行:

        List1.ListIndex = 1

后可以让List1中的第2项被选中。又例如在图4.17中当选中第4项“桔子”时List1.ListIndex的值会被设置为3。

5. MultiSelect属性

该属性决定了是否在列表框框内可以选择多项。其值可以被设置为0、1或2。具体意义如下。

❑设置为0:表示一次只能选择一项,不能在列表框中选择多项。

❑设置为1:表示允许选择列表框中多个项,每用鼠标单击一个项,则该项被选中。

❑设置为2:表示可以选择列表框中某个范围内的项,即可以用Shift+单击鼠标,选择一组连续排列的项;或用Ctrl+单击鼠标,选择一组不连续排列的项。

6. Selected属性

该属性也是一个数组。使用该属性可以判断列表框中的列表项是否被选中,也可以通过该属性设置列表项的选择状态,其值可以是True或False,当为True时表示此项被选中,当为False时表示此项没有被选中。例如用下面的语句可以取消List1中第4项被选择的状态。

        List1.Selected(3) = False

又例如可以用下面的程序判断列表框中的第1项是否被选中。

        If List1.Selected(0) = True Then
            MsgBox "第1项被选中了!"
        Else
            MsgBox "第1项没有被选中!"
        End If

7. Sorted属性该属性用来确定列表框中的列表项是否排序。如果将其设置为True则列表项按字母、数字升序排序,如果设置为False则不排序,即列表项按照加入列表框的先后次序排列。

8. Style属性

该属性用来确定列表框的外观,其值可以设置为0和1。具体外观如图4.18所示。

图4.18 Style属性设置

9. Text属性

在只能选择一项(MultiSelect=0)的列表框里Text属性的值是被选中的列表项的内容,而在能够多选(MultiSelect=1或2)的列表框里Text属性的值为最后一次选中的列表项的内容。在此说明一点,列表框的Text属性不能被赋值,只能提取内容。

4.8.3 列表框的方法和事件

1. AddItem(插入列表项)方法

AddItem方法用来在列表框中插入列表项。虽然在设计阶段可以通过属性窗口里的List属性向列表框内添加列表项,但是考虑到实际应用通常会用程序向列表框内添加列表项。AddItem方法的通用格式为:

        列表框.AddItem   项目字符串[,索引号]

AddItem方法把“项目字符串”的文本内容放入到列表框中。“索引号”可以指定插入项在列表框中的位置。如果省略“索引号”,该项就会被添加到列表框的末尾。

【实例4.9】编写程序,试验AddItem方法。

新建一个标准EXE工程后,在Form1窗体上画一个列表框,并使用其默认名称List1。双击Form1窗体后写入如下代码:

        01   Private Sub Form_Load()
        02         List1.AddItem "Visual Basic教程"
        03         List1.AddItem "Visual C++教程"
        04         List1.AddItem "Visual FoxPro数据库应用"
        05         List1.AddItem "java语言程序设计"
        06   End Sub

【代码说明】代码第02~05行非常简单,只是演示了AddItem方法,其中的参数值就是显示在列表框中的内容。

【运行效果】运行该程序后,窗体的Form_Load事件自动被触发,随之执行其内的语句,向列表框List1添加了4个列表项。运行结果如图4.19所示。

图4.19 实例4.9运行结果

2. Clear(清除列表框)方法

该方法用来清除列表框中的所有内容。通用格式为:

        列表框.Clear

3. RemoveItem(删除列表项)方法

该方法用来删除列表框中指定的项目。通用格式为:

        列表框. RemoveItem   索引号

例如,要删除列表框List1中第3项时可以用如下语句来完成。

        List1. RemoveItem   2

又例如要删除当前被选择的列表项时可以使用语句:

        List1.RemoveItem   List1.ListIndex

因为,List1.ListIndex代表的是当前被选择的列表项的索引号。

4. DblClick(双击)事件

列表框可以响应Click和DblClick事件。其Click事件和其他控件的Click事件没有什么区别,在此不再重复。DblClick事件在双击列表框时被触发。

【实例4.10】如图4.20所示,编写一个选购物品的程序。

图4.20 实例4.10运行效果

【运行效果】

❑在左侧的列表框内列出所有可以购买的物品。

❑当要购买某物品时用鼠标双击该物品,此时该物品就会被添加到右侧的列表框内。

❑如果想取消购买的某物品,可以在右侧的已经购买的列表框中双击该物品名称,即可从列表框中删除。

程序中各对象属性设置如表4.13所示。

【代码说明】

(1)要实现第一种效果,应当在窗体的加载事件中写入给列表框List1添加项目的代码,代码清单如下。

        01   Private Sub Form_Load()
        02        List1.AddItem "牛奶"
        03        List1.AddItem "奶茶粉"
        04        List1.AddItem "啤酒"
        05        List1.AddItem "羊绒衫"
        06        List1.AddItem "西装"
        07        List1.AddItem "领带"
        08   End Sub

表4.13 实例4.10对象的属性设置

(2)要实现双击List1中的列表项时将其添加到List2中,代码应该写在List1的双击事件里,并应当使用List2列表框的AddItem方法将List1列表框当前被选择的列表项的内容添加到List2中。代码清单如下。

        09   Private Sub List1_DblClick()
        10         List2.AddItem   List1.Text
        11   End Sub

(3)实现在List2中双击删除列表项时,代码应该写在List2的双击事件里,并使用List2的RemoveItem方法删除当前所选择的项目。代码清单如下。

        12   Private Sub List2_DblClick()
        13         List2.RemoveItem   List2.ListIndex
        14   End Sub

4.8.4 组合框介绍

组合框可以说是列表框和一个文本框的组合。在Visual Basic的属性窗口里用到Font属性时,其弹出的“字体”对话框内选择“字体”、“字形”、“大小”和“字符集”的控件都是组合框控件,如图4.21所示。组合框解决了列表框内只能选择给定的选项而不能输入用户选项的缺点。同时组合框可以结合下拉部分,这就意味着组合框可以比普通的列表框占用更小的窗体空间。

图4.21 字体对话框

4.8.5 组合框的属性、方法和事件

列表框的属性、方法和事件基本上都可用于组合框,此外它还有一些自己的属性和事件。

1. 组合框的属性

(1)Style属性

该属性不同的取值决定了组合框3种不同的类型,如图4.22所示。其取值范围为0、1或2。具体取值含义如下。

❑当Style的属性值为0时,组合框称为“下拉式组合框”。它由可输入的编辑区和一个下拉列表框组成,用户可以用键盘直接向文本编辑区输入内容,也可以单击右端的箭头,从下拉的列表框中选择一项,单击该项使之被选中,则上面文本区就出现该项的内容。

❑当Style的属性值为1时,称为“简单组合框”,它也是由一个文本区和一个列表框组成,但该列表框不是下拉式的,而是始终显示在屏幕上的。在画组合框时可按自己的意愿选择组合框的大小。如果所选择的组合框的大小不能将全部项目在列表框中显示出来,在列表框的右侧就会出现一垂直滚动条,用户可以通过滚动条浏览无法直接显示在列表框中的项目。如果所选择的组合框的大小能将全部项目在列表框中显示出来,在列表框的右侧不会出现垂直滚动条。用户可以从列表框中选择所需要的项目,也可以直接向文本区输入信息。这种组合框可以识别DblClick事件(其他两种不能识别DblClick事件)。

❑当Style的属性值为2时,称为“下拉式列表框”,它的形状与“下拉式组合框”相似,右端也有一个箭头能弹出一个下拉式列表框,但用户只能从列表框中选择,而不能直接向文本区输入。Visual Basic代码编辑器窗口的对象框和过程框都是这种类型的组合框。在实际编程中,可以根据需要选择使用以上3种组合框。

图4.22 组合框的3种类型

(2)Text属性

Text属性的值是在其文本区中显示出来的内容。例如,如图4.21的最左侧的组合框的名称为Combo1,则Combo1.Text的值为“桔子”。利用Text属性也可以设置组合框的文本区中显示的内容,例如,语句

        Combo1.Text="请在此选择水果种类"

的作用为在文本区中显示字符串“请在此选择水果种类”。通常用此方法在窗口显示的最初时,提示用户对组合框进行操作。

注意

不能用Text属性向组合框添加列表项,只能用其控制文本区中显示的内容。

2. 组合框的方法

前面介绍的AddItem、Clear和RemoveItem方法也同样适用于组合框,其用法和列表框的用法也相同。

3. 组合框的事件

组合框响应的事件依赖于其Style属性。例如,只有简单组合框(Style=1)才能接收DblClick事件,其他两种组合框可以接收Click事件和DropDown事件。对于下拉式组合框(Style=0)和简单组合框,可以在编辑区输入文本,当输入文本时可以接收Change事件。当用户单击组合框中向下的箭头时,将触发DropDown事件。

4.8.6 应用案例—计算机订购程序

【实例4.11】如图4.23a所示,编写一个计算机订购程序。

【运行效果】

❑用两个单选按钮“台式机”(optPC)和“笔记本电脑”(optNoteBook)选择机器的类型,当选择“台式机”时右侧的列表框(List1)中会显示字符串“类型:台式机”,如果选择“笔记本电脑”列表框中会显示“类型:笔记本电脑”。其中,“台式机”单选按钮为默认选项。

❑用3个复选框cboCPU、cboMemory、cboHardDisk来分别选择“CPU型号”、“内存容量”和“硬盘容量”,在选择的同时,右侧的列表框中将出现选择的结果,如图4.23b所示。

❑单击“全部重选”(cmdClearList)按钮,会将界面中的各选项还原到图4.23a所示的初始状态;单击“确定订购”(cmdOrder)按钮会弹出一个消息框;单击“取消订购”(cmdCancel)按钮会卸载窗体。

图4.23 实例4.11效果

程序中各对象需要更改的属性如表4.14所示,其他属性均取默认值。

表4.14 实例4.11对象的属性设置

编写事件过程如下。

        01   Private Sub Form_Load()
        02        List1.AddItem "类型:台式机"   '给List1添加初始列表项,以配合单选按钮“台式机”的被选择状态
        03        optPC.Value = True      '将单选按钮“台式机”的状态设置为被选择状态
        04
        05       cboCPU.Text = "——请选择CPU型号——"               '设置组合框文本区中的提示文字
        06       cboMemory.Text = "——请选择内存容量——"
        07       cboHardDisk.Text = "——请选择硬盘容量——"
        08
        09       cboCPU.AddItem "CPU:英特尔奔腾2.0G处理器"         '给组合框添加列表项
        10       cboCPU.AddItem "CPU:英特尔酷睿2双核处理器"
        11       cboCPU.AddItem "CPU:英特尔奔腾D双核处理器"
        12       cboCPU.AddItem "CPU:AMD 速龙64 3000+处理器"
        13       cboCPU.AddItem "CPU:AMD 速龙64X2处理器"
        14
        15       cboMemory.AddItem "内存:256M"
        16       cboMemory.AddItem "内存:512M"
        17       cboMemory.AddItem "内存:1G"
        18       cboMemory.AddItem "内存:2G"
        19
        20       cboHardDisk.AddItem "硬盘:80G"
        21       cboHardDisk.AddItem "硬盘:120G"
        22       cboHardDisk.AddItem "硬盘:160G"
        23       cboHardDisk.AddItem "硬盘:320G"
        24 End Sub
        25
        26 Private Sub optPC_Click()
        27       List1.RemoveItem 0                          '将List1中的第一项删除
        28       List1.AddItem "类型:台式机", 0            '将列表项添加到List1的第一个位置上
        29 End Sub
        30
        31 Private Sub optNoteBook_Click()
        32       List1.RemoveItem 0
        33       List1.AddItem "类型:笔记本电脑", 0
        34 End Sub
        35
        36 Private Sub cboCPU_Click()
        37       List1.AddItem cboCPU.Text '将列表项添加到List1中
        38 End Sub
        39
        40 Private Sub cboMemory_click()
        41       List1.AddItem cboMemory.Text
        42 End Sub
        43
        44 Private Sub cboHardDisk_Click()
        45       List1.AddItem cboHardDisk.Text
        46 End Sub
        47
        48 Private Sub cmdOrder_Click()
        49       MsgBox "恭喜您订购成功!您的订单编号是0001", vbInformation + vbOKOnly, "提示框"
        50 End Sub
        51
        52 Private Sub cmdCancel_Click()
        53       Unload Me
        54 End Sub
        55 Private Sub cmdClearList_Click()
        56       List1.Clear
        57
        58       List1.AddItem "类型:台式机"
        59       optPC.Value = True
        60
        61       cboCPU.Text = "——请选择CPU型号——"
        62       cboMemory.Text = "——请选择内存容量——"
        63       cboHardDisk.Text = "——请选择硬盘容量——"
        64       cboCPU.SetFocus
        65 End Sub

【代码说明】其中,代码第01~24行的Form_Load事件和代码第55~65行的cmdClearList_Click事件中,以下两条语句:

        List1.AddItem "类型:台式机"
        optPC.Value = True

的位置不能互换,原因是语句optPC.Value = True会触发optPC_Click事件,随即会执行其内的语句

        List1.RemoveItem 0

用来删除List1中的第1项。但此时,列表框List1中没有列表项,因此会产生“无效的过程调用或参数”的错误。

本程序只是用于演示组合框、列表框、单选按钮、命令按钮、框架和标签的协同工作时的一些编程方法,目的在于对上面讲述的知识进行融会贯通,因此程序的功能并不完善。