# ListBox 控件应用方案

## 知识讲解

#### 1．功能

ListBox 控件用于显示项目列表，从列表中可以选择一项或多项。如果项目总数超过了可显示的项目数，则会自动在 ListBox 控件上添加滚动条。

#### 2．属性

ListBox 控件的常用属性介绍如表 1 所示。

表 1 ListBox 控件的常用属性

编号 | 属性 | 说明
1 | Columns | 返回或设置一个值，以决定 ListBox 控件是水平还是垂直滚动，以及如何显示列中的项目。如果是水平滚动，则 Columns 属性决定显示多少列
2 | List | 返回或设置控件的列表部分的项目。列表是一个字符串数组，数组的每一项都是一列表项目，对 ListBox 控件在设计时可以通过属性浏览器得到，在运行时是可读写的
3 | ListCount | 返回控件列表部分项目的个数
4 | ListIndex | 返回或设置控件中当前选择项目的索引，在设计时不可用
5 | MultiSelect | 返回或设置一个值，该值指示是否能够在 ListBox 控件中进行复选以及如何进行复选。在运行时该属性只读
6 | NewIndex | 返回最近加入 ListBox 控件项的索引。在运行时是只读的
7 | SelCount | 返回在 ListBox 控件中被选中项的数量
8 | Selected | 返回或设置在 ListBox 控件中的一个项的选择状态。该属性是一个与 List 属性一样、有相同项数的布尔值数组。该属性在设计时不可用
9 | Sorted | 返回一个值，指定控件的元素是否自动按字母表顺序排序
10 | Style | 返回或设置一个值，该值用来指示控件的显示类型和行为。在运行时是只读的
11 | Tag | 返回或设置一个表达式用来存储程序中需要的额外数据。与其他属性不同，Tag 属性值不被 Visual Basic 使用；可以用该属性来标识对象
12 | Text | 返回列表框中选择的项目。返回值总与表达式 List(ListIndex)的返回值相同
13 | TopIndex | 返回或设置一个值，该值指定在 ListBox 控件中的哪个项被显示在顶部的位置上

下面对比较重要的属性进行详细介绍。

（1）Columns 属性

返回或设置一个值，以决定 ListBox 控件是水平还是垂直滚动，以及如何显示列中的项目。如果水平滚动，则 Columns 属性决定显示多少列。

语法：

object.Columns [= number]

object：对象表达式。

number：一个整型值，指定控件如何滚动以及列中的项目如何排列。其设置值如表 2 所示。

表 2 number 的设置值

设置值 | 说明
0 | 项目安排在一列中、且 ListBox 竖直滚动
1～n | 项目安排在多个列中，先填第 1 列，再填第 2 列，等等。ListBox 水平滚动并显示指定数目的列

本示例中在程序运行前通过属性窗口将 List2 控件的 Columns 属性设置为 2，将 List1 控件的 Columns 属性设置为 0（即为默认值）。通过程序代码分别向 List1 和 List2 中添加相同的项目，程序运行时两个 ListBox 控件中显示的数据结果如图 1 所示。

图 1 Columns 属性应用示例

注意：对于具有水平滚动条的ListBox控件，列宽等于ListBox宽度除以列的个数。

（2）List 属性

返回或设置控件列表部分的项目。

语法：

object.List(index) [= string]

object：对象表达式。

Index：列表中具体某一项目的号码。

string：字符串表达式，指定列表项目。

示例：

下例演示的是，在程序运行时，当单击选择列表中的项目时，在下面的标签中将显示所选择列表中项目的名称，如图 2 所示。

图 2 List 属性应用示例

程序代码如下：

'当点击 ListBox 中的一个项目时将其显示在标签一中

Private Sub List1_Click()

Label1.Caption = "当前选择列表中的项目为：" & List1.List(List1.ListIndex)

End Sub

程序完整代码：

'窗体启动时对 ListBox 控件进行初始化

Private Sub Form_Load()

For i = 0 To 20

List1.AddItem "List1(" & i & ")"

Next

End Sub

'当点击 ListBox 中的一个项目时将其显示在标签一中

Private Sub List1_Click()

Label1.Caption = "当前选择列表中的项目为：" & List1.List(List1.ListIndex)

End Sub

（3）ListCount 属性

返回控件列表部分项目的个数。

语法：

object.ListCount

object：对象表达式。

下面的例子演示的是利用 ListBox 控件的 ListCount 属性来显示 ListBox 控件列表中元素的个数。窗体运行时，在窗体的标签控件中将显示 List1 控件列表中元素的个数，如图 3 所示。

图 3 ListCount 属性的应用示例

程序完整代码如下：

'窗体启动时对 ListBox 控件进行初始化并在标签中显示其项目的个数

Private Sub Form_Load()

For i = 0 To 20

List1.AddItem "List1(" & i & ")"

Next

Label1.Caption = "列表中元素的个数为：" & List1.ListCount & "个"

End Sub

（4）ListIndex 属性

返回或设置控件中当前选择项目的索引。

语法：

object.ListIndex [= index]

object：对象表达式。

index：数值表达式，指定当前项目的索引。

（5）MultiSelect 属性

返回或设置一个值，该值指示是否能够在 ListBox 控件中进行复选以及如何进行复选。该属性在运行时为只读。

语法：

object.MultiSelect

object：对象表达式。

MultiSelect 属性设置值如表 3 所示。

表 3 MultiSelect 属性的设置值

设置值 | 说明
0 | 不允许复选
1 | 简单复选。通过鼠标单击或按下〈SpaceBar〉（空格键）在列表中选中或取消选中项
2 | 扩展复选。按下〈Shift〉并单击鼠标或按下〈Shift〉以及一个箭头键（上箭头、下箭头、左箭头和右箭头）将在以前选中项的基础上扩展选择到当前选中项。按下〈Ctrl〉并单击鼠标来在列表中选中或取消选中项

#### 3．方法

ListBox 控件的常用方法介绍如表 4 所示。

表 4 ListBox 控件的常用方法

编号 | 方法 | 说明
1 | AddItem | 用于将项目添加到 ListBox 或 ComboBox 控件，或者将行添加到 MSFlexGrid 控件。不支持命名参数
2 | Clear | 用于清除 ListBox 的内容
3 | RemoveItem | 用以从 ListBox 控件中删除一项。不支持命名参数
4 | ShowWhatsThis | 显示 Windows95 Help 所提供的“这是什么”弹出式窗口使用的 Help 文件中选定的一个主题

下面对比较重要的方法进行详细介绍。

（1）AddItem 方法

用于将项目添加到 ListBox 控件。不支持命名参数。

语法：

object.AddItem item, index

object：必需的参数。对象表达式。

Item：必需的参数。字符串表达式，用来指定添加到该对象的项目。

Index：可选的参数。整数，用来指定 ListBox 控件的首项。

示例：

下例实现的是，当程序运行时，在窗体上每单击一次“添加”按钮，将向 ListBox 控件的列表中添加一个控件元素，如图 4 所示。

图 4 AddItem 方法的应用示例

程序代码如下：

Dim i As Integer

单击“添加”按钮向列表中添加对象：

Private Sub Command1_Click()

List1.AddItem "List" & i

i = i + 1

End Sub

单击“清除”按钮清除列表中的对象：

Private Sub Command2_Click()

List1.Clear

End Sub

程序完整代码：

Dim i As Integer

'单击添加按钮在 ListBox 控件中添加项目

Private Sub Command1_Click()

List1.AddItem "List" & i

i = i + 1

End Sub

'单击"清除"按钮清除列表中的对象

Private Sub Command2_Click()

List1.Clear

End Sub

（2）Clear 方法

用于清除 ListBox 的内容。

语法：

object.Clear

object：对象表达式。

#### 4．事件

下面介绍 ListBox 控件常用的事件。

（1）Click 事件

此事件是在一个对象上按下然后释放一个鼠标按键时发生，它也会在一个控件值改变时发生。对于 ListBox 控件来说，该事件在单击鼠标左键时发生。

语法：

Private Sub object_Click([index As Integer])

object：对象表达式。

index：一个整数，用来惟一地标识一个在控件数组中的控件。

（2）ItemCheck 事件

当 ListBox 控件的 Style 属性设置为 1（复选框），并且 ListBox 控件中一个项目的复选框被选定或者被清除时该事件发生。

语法：

Private Sub object_ItemCheck([index As Integer])

object：对象表达式。

index：一个整数，惟一地标识该列表框中被选中的项。

示例：

下面的例子演示的是 ListBox 控件的 ItemCheck 事件。在程序运行前，将 ListBox 控件的 Style 属性设置为 1。在运行时，选中 ListBox 控件中的数据项，即触发了 ItemCheck 事件，在下面的标签中显示出当前所选的数据项目，如图 5 所示。

图 5 ItemCheck 事件的应用示例

程序完整代码如下：

Dim i As Integer

Dim a As String

'单击添加按钮在 ListBox 控件中添加项目

Private Sub Command1_Click()

List1.AddItem "List" & i

i = i + 1

End Sub

'单击"清除"按钮清除列表中的对象

Private Sub Command2_Click()

List1.Clear

End Sub

'窗体启动时对 ListBox 控件进行初始化

Private Sub Form_Load()

For i = 0 To 10

List1.AddItem "List" & i

Next i

End Sub

'选中 ListBox 控件中的数据项，即触发了 ItemCheck 事件，并在标签中显示选中内容

Private Sub List1_ItemCheck(Item As Integer)

If List1.Selected(List1.ListIndex) = True Then

a = a + " " + List1.List(List1.ListIndex)

Label1.Caption = "已经选择了：" & a

End If

End Sub

## 应用一：ListBox 控件拒绝添加重复信息

本例中单击【添加】按钮，向 ListBox 控件中添加城市名称，每次单击【添加】按钮时，都循环检索 ListBox 控件中的数据，如果发现有和文本框中输入的项目相同的项目，则拒绝添加该信息。其实现的关键代码如下。

' ListBox 控件拒绝添加重复信息

Private Sub Cmd_Add_Click() '【添加】按钮

If Text1.Text = "" Then

MsgBox "输入的城市信息不能为空值!!", 64, "提示信息"

Text1.SetFocus

Else

If List1.ListCount > 0 Then '当列表项个数大于 0

For j = 0 To List1.ListCount '遍历列表项

If List1.List(j) = Text1.Text Then '列表项与文本框内容比较

MsgBox "该信息已经存在,不能够录入重复信息", , "提示信息"

Text1.Text = "": Text1.SetFocus: Exit Sub

End If

Next j

Else

End If

List1.AddItem Text1.Text '添加列表项

End If

cmd_Cancel.SetFocus '设置焦点

End Sub

运行效果如图 6 所示。

图 6 拒绝重复信息的 ListBox 控件

## 应用二：ListBox 控件在工程中的应用

ListBox 控件可以显示项目列表，在列表中可以选择一项或多项。在工资管理系统中通过两个 ListBox 控件完成工资项目的选择。一个显示源工资项目，另一个显示目标项目，如图 7 所示。

图 7 工资项目界面

使用 AddItem 或者 RemoveItem 方法可以添加或者删除 ListBox 控件中的项目。对 List、ListCount 和 ListIndex 属性进行设置就可以访问 ListBox 中的项目，也可以在设计时使用 List 属性在列表中增加项目。

具体设计方法如下：

（1）新建一个标准工程，在此工程中添加一个新窗体。

（2）在该窗体中放置 2 个 ListBox 控件和 4 个 CommandButton 控件。将 ListBox 控件分别命名为“lstFields1”和“lstFields2”。

（3）程序代码如下：

Dim rs2 As New ADODB.Recordset

Dim i As Integer

'窗体启动，连接数据库，对 ListBox1 控件初始化

Private Sub Form_Load()

'返回一个数据库

Set cnn = New ADODB.Connection '创建数据库连接对象

cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\gzgl.mdb;Persist Security Info=False" '打开数据库

rs1.Open "select * from 工资数据表", cnn, adOpenKeyset, adLockOptimistic'查询

Dim fld '声明变体类型变量

Set fld = rs1.Fields '引用记录集中的字段集合

For i = 4 To 13'循环

lstFields1.AddItem fld(i).Name'添加列表项

Next i

lstFields1.AddItem fld(15).Name

lstFields1.AddItem fld(16).Name

lstFields1.AddItem fld(17).Name

lstFields1.AddItem fld(19).Name

rs1.Close

End Sub

'单击按钮 1 将 ListBox 控件 1 中的项目全部转入 ListBox 控件 2

Private Sub Command1_Click()

For i = 0 To lstFields1.ListCount – 1'遍历列表项

lstFields1.ListIndex = i '指定选中列表项索引

lstFields2.AddItem (lstFields1.Text)'添加列表项

Next i

lstFields1.Clear '清空列表

End Sub

'单击按钮 2 将 ListBox 控件 1 中被选中的项目转入 ListBox 控件 2

Private Sub Command2_Click()

lstFields2.AddItem lstFields1.Text '添加列表项

lstFields1.RemoveItem lstFields1.ListIndex '删除当前选中项

End Sub

'单击按钮 3 将 ListBox 控件 2 中被选中的项目转入 ListBox 控件 1

Private Sub Command3_Click()

lstFields1.AddItem lstFields2.Text '添加列表项

lstFields2.RemoveItem lstFields2.ListIndex '删除当前选中项

End Sub

'单击按钮 4 将 ListBox 控件 2 中的项目全部转入 ListBox 控件 1

Private Sub Command4_Click()

For i = 0 To lstFields2.ListCount – 1 '变量所有列表项

lstFields2.ListIndex = i '指定选中列表项索引

lstFields1.AddItem (lstFields2.Text) '添加列表项

Next i

lstFields2.Clear

End Sub

## 应用三：带水平滚动条的 ListBox 控件

### 实例说明

在使用 ListBox 控件编写应用程序的时候，经常会遇到这样的情况：如果在 ListBox 控件中输入的文本信息过长，则有一部分文本信息会被挡住，这样将影响阅读；如果将 ListBox 控件的宽度加宽又会影响窗体的整体布局。下面将介绍如何在 ListBox 控件中添加滚动条。运行程序，在文本框中输入要添加的信息，按回车键即可将相应的信息添加到 ListBox 控件中。如本实例中，输入“明日科技”后，LisBox 中没有水平滚动条，输入“吉林省明日科技有限公司”后，ListBox 中出现水平滚动条。实现效果如图 8 所示。

图 8 带水平滚动条的 ListBox 控件

### 思路与技术

使用 API 函数中的 SendMessage 函数发送 LB_SETHORIZONTALEXTENT 消息给 ListBox 控件，设定 ListBox 控件的水平滚动条。

SendMessage 函数的作用是调用一个窗口的窗口函数，将一条信息发给那个窗口。直到信息被处理完毕，该函数才会返回。

函数的声明过程如下：

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

参数说明：

l hWnd Long 型。要接收消息的那个窗口的句柄。

l wMsg Long 型。消息的标识符。

l wParam Long 型。具体取决于消息。

l lParam Any 型。具体取决于消息。

### 开发步骤

（1）新建一个标准工程，创建一个新窗体，默认名为 Form1。

（2）在窗体上添加一个 Frame 控件。

（3）在 Frame1 上添加两个 Frame 控件。

（4）在 Frame2 上添加一个 ListBox 控件，用于显示添加的数据信息。

（5）在 Frame3 上添加一个 TextBox 控件和一个 Image 控件。设置 Image 控件的 BorderStyle 属性为 1-Fiexed Single。

表 5 Form1 窗体中控件部分属性设置

控件名 | 属性 | 值
Frame | Name | Frame1
Frame | Name Caption0 | Frame2 显示信息
Frame | Name Caption | Frame3 输入信息
Image | Name | Image1
ListBox | Name | List1
TextBox | Name | Text1

（6）为 Form1 窗体添加如下代码。

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long'声明 API

Const LB_SETHORIZONTALEXTENT = &H194 '声明常量

'启动窗体并初始化

Private Sub Form_Load()

Me.ScaleMode = vbPixels '设置刻度单位为像素

Me.Font.Size = List1.Font.Size '字体大小

End Sub

'按回车键将文本框中信息添加到 ListBox 控件中若文本信息宽度大于 ListBox 控件显示

'水平滚动条

Private Sub Text1_KeyPress(KeyAscii As Integer)

If KeyAscii = 13 Then '当按回车键时

List1.AddItem Text1.Text '添加列表项

If Me.TextWidth(Text1) >= 0.07 * Me.List1.Width Then

SendMessage List1.hwnd, LB_SETHORIZONTALEXTENT, 6 * Me.TextWidth(Text1), ByVal 0& '发送滚动条消息

End If

End If

End Sub

## 应用四：利用 ListBox 控件实现标签式数据选择

### 实例说明

本实例是通过选择 ListBox 控件中的项目来控制菜单项是否可用。运行程序，选中 ListBox 控件中的标签，则该列表项所控制的菜单项有效，否则无效。其效果如图 9 所示。

图 9 利用 ListBox 控件实现标签式数据选择

### 思路与技术

设置 ListBox 控件的 Style 属性可以实现标签式数据选择。

Style 属性可以返回或设置一个值，该值用来指示控件的显示类型和行为。在运行时是只读的。

其语法形式如下：

object.Style

参数说明：

l object 代表一个对象表达式。

对于 ListBox 控件，Style 的属性值有以下两种。

l VbListBoxStandard （0 缺省值）标准的。ListBox 控件按它在 Visual Basic 老版本中的样子显示，即文本项的列表。

l VbListBoxCheckbox （1 复选框）在 ListBox 控件中，每一个文本项的前面都有一个复选框。在 ListBox 中可以选择多项。

### 开发步骤

（1）新建一个标准工程，创建一个新窗体，默认名为 Form1。

（2）在窗体上添加菜单。从“工具”菜单上，选择“菜单编辑器”命令即可打开菜单编辑器，也可以在“工具栏”上单击“菜单编辑器”按钮。设计菜单如图 2.9 所示。

（3）在窗体上添加两个 Frame 控件。

（4）在 Frame1 控件中添加一个 ListBox 控件。

（5）在 Frame2 控件中添加一个 Image 控件和一个 ListBox 控件，设置 Image 控件的 Stretch 属性为 True，并设置其 Picture 属性。设置 List2 控件的 Style 属性为 1-Checkbox。

表 6 Form1 窗体中控件部分属性设置

控件名 | 属性 | 值
Frame | Name Caption | Frame1 操作员
Frame | Name Caption | Frame2 权限设置
Image | Name Stretch | Image1 True
ListBox | Name | List1
ListBox | Name Style | List2 1-Checkbox

（6）菜单编辑器相关内容如图 10 所示:

图 10 菜单编辑器内容

（7）为 Form1 窗体添加如下代码。

'窗体启动并进行初始化

Private Sub Form_Load()

List1.AddItem ("张丽") '添加列表项

List2.AddItem "基本信息管理": List2.AddItem "前台信息管理"

List2.AddItem "后台信息管理": List2.AddItem "经理查询系统"

List2.AddItem "系统维护"

For i = 0 To List2.ListCount – 1 '遍历所有列表项

List2.Selected(i) = True '选中由变量 i 所指定的列表项

Next i

End Sub

'用 ListBox 控件中一个项目的复选框被选定或清除来确定窗体的菜单项是否可用

Private Sub List2_ItemCheck(Item As Integer)

For i = 0 To List2.ListCount – 1 '变量所有列表项

If List2.Selected(i) = True Then '当某列表项被选中时

Form1.mnu1(i).Enabled = True '设置变量 i 所指定的菜单项状态为可用

Else

Form1.mnu1(i).Enabled = False '设置变量 i 所指定的菜单项状态为不可用

End If

Next i

End Sub