# ComboBox 控件应用方案

## 知识讲解

#### 1．功能

组合框（ComboBox）是文本框（TextBox）和列表框（ListBox）的组合。用户可以从文本框中输入文本，也可以从列表框中选取列表项。

#### 2．属性

ComboBox 控件的常用属性如表 1 所示。

表 1 ComboBox 控件的常用属性

编号 | 属性 | 说明
1 | IntegralHeight | 返回或设置一个值，指示控件是否显示部分项目。运行时是只读的
2 | List | 返回或设置控件列表部分的项目
3 | ListCount | 返回控件的列表部分项目的个数
4 | ListIndex | 返回或设置控件中当前选择项目的索引，在设计时不可用
5 | Locked | 返回或设置一个值，以指定控件是否可被编辑
6 | Sorted | 返回一个值，指定控件的元素是否自动按字母表顺序排序
7 | Style | 返回或设置一个值，该值用来指示控件的显示类型和行为
8 | TabIndex | 返回或设置父窗体中大部分对象的〈Tab〉键次序
9 | Text | ComboBox 控件（Style 属性设置为 0（下拉组合框）或为 1（简单组合框））返回或设置编辑域中的文本

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

（1）List 属性

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

语法：

object.List(index) [= string]

object：对象表达式。

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

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

示例：

下例演示的是，当程序运行时，当单击 ComboBox 控件列表中对象后，在标签控件中将显示所选择的对象名称，如图 1 所示。

图 1 List 属性演示示例

程序代码如下：

'单击 ComboBox 控件列表中对象后，在标签控件中将显示所选择的对象名称

Private Sub Combo1_Click()

Label1.Caption = "选取的项目为：" & Combo1.List(Combo1.ListIndex)

End Sub

'窗体启动时组合框 1 中自动加十一个从 Combo1(0)到 Combo1(10)的项目

Private Sub Form_Load()

For i = 0 To 10

Combo1.AddItem "Combo1(" & i & ")"

Next

End Sub

（2）ListCount 属性

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

语法：

object.ListCount

object：对象表达式。

示例：

下例演示的是如何向 ComboBox 控件中加载项目。程序运行后单击窗体，在标签控件中将显示 ComboBox 控件中所加载项目的个数，如图 2 所示。

图 2 ListCount 属性的应用示例

程序完整代码如下：

'单击窗体时在标签控件中将显示 ComboBox 控件中所加载项目的个数

Private Sub Form_Click()

Label1.Caption = "列表中的项目为：" & Combo1.ListCount & "个"

End Sub

'向 ComboBox 控件中加入 121 个项目

Private Sub Form_Load()

For i = 0 To 120

Combo1.AddItem "Combo1(" & i & ")"

Next

End Sub

（3）ListIndex 属性

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

语法：

object.ListIndex [= index]

object：对象表达式。

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

示例：

下面的例子演示的是 ComboBox 控件的 ListIndex 属性，用于显示每个季节的销售额。程序运行时，在 ComboBox 控件中选择季节名称，在标签中就会显示出该季节的销售信息，如图 3 所示。

图 3 ListIndex 属性的应用示例

程序完整代码如下：

Dim Season(0 To 3) '声明两个数组的大小

Dim Sale(0 To 3)

'在 ComboBox 控件中选择季节名称，在标签中就会显示出该季节的销售信息

Private Sub Combo1_Click()

Label1.Caption = Combo1.Text & " " & Sale(Combo1.ListIndex)

End Sub

'窗体加载时设置 ComboBox 控件的项目名称和项目索引

Private Sub Form_Load()

Dim i '声明变量

AutoSize = True

Season(0) = "春季"

Season(1) = "夏季"

Season(2) = "秋季"

Season(3) = "冬季"

Sale(0) = "$1300,500"

Sale(1) = "$208,900"

Sale(2) = "$1,412,500"

Sale(3) = "$1,220,500"

For i = 0 To 3 '在列表中添加名字

Combo1.AddItem Season(i)

Next i

Combo1.ListIndex = 0 '显示列表中的第一项

End Sub

（4）Style 属性

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

语法：

object.Style

object：对象表达式。其设置值如表 2 所示。

表 2 object 的设置值

常数 | 值 | 说明
VbComboDropDown | 0 | 下拉式组合框。包括一个下拉式列表和一个文本框。可以从列表选择或在文本框中输入
VbComboSimple | 1 | 简单组合框。包括一个文本框和一个不能下拉的列表。可以从列表中选择或在文本框中输入内容
VbComboDrop-DownList | 2 | 下拉式列表。这种样式仅允许从下拉式列表中选择

下面的例子演示的是 ComboBox 控件的 Style 属性。设置 3 个不同的属性值后的效果如图 4 和图 5 所示。

图 4 未添加时的效果

图 5 添加后的效果

#### 3．方法

下面介绍 ComboBox 控件比较重要的方法。

（1）AddItem 方法

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

语法：

object.AddItem item, index

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

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

index：可选的整数值，用来指定新项目或行在该对象中的位置。

示例：

下面的例子演示的是 ComboBox 控件的 AddItem 方法。利用 AddItem 方法将月份信息添加到 ComboBox 控件的列表当中，如图 6 所示。

图 6 AddItem 方法的应用示例

程序完整代码如下：

'将项目 1 月到 12 月添加到 ComboBox 控件中

Private Sub Form_Load()

For i = 0 To 11

Combo1.AddItem i + 1 & " 月"

Next

End Sub

（2）Clear 方法

用于清除 ComboBox 控件中的内容。

语法：

object.Clear

object：对象表达式。

示例：

下例演示的是，当程序运行的时候，单击窗体上的“清除”按钮将清除 ComboBox 控件中的内容，如图 7 所示。

图 7 Clear 方法的应用

程序相关代码如下：

'点击清除按钮时清除 ComboBox 控件中的内容

Private Sub Command1_Click()

Combo1.Clear

End Sub

程序完整代码：

'点击清除按钮时清除 ComboBox 控件中的内容

Private Sub Command1_Click()

Combo1.Clear

End Sub

'窗体启动时将项目 1 月到 12 月添加到 ComboBox 控件中

Private Sub Form_Load()

For i = 0 To 11

Combo1.AddItem i + 1 & " 月"

Next

End Sub

#### 4．事件

ComboBox 控件的常用事件如表 3 所示。

表 3 ComboBox 控件的常用事件

编号 | 事件 | 说明
1 | Change | 当控件的内容发生改变时发生。该事件仅在 Style 属性设置为 0（下拉 Combo）或 1（简单 Combo）和正文被改变或者通过代码改变了 Text 属性的设置时才会发生
2 | DblClick | 当在一个对象上按下和释放鼠标按键并再次按下和释放鼠标按键时，该事件发生
3 | DropDown | 该事件是当 ComboBox 控件的列表部分正要展开时发生
4 | Scroll | 当 Combo Box 控件的滚动条被重新定位时，此事件发生

下面对比较重要的事件进行详细介绍。

（1）Change 事件

改变控件文本框部分的正文。该事件仅在 Style 属性设置为 0 或 1 和正文被改变或者通过代码改变了 Text 属性的设置时才会发生。

语法：

Private Sub object_Change([index As Integer])

object：对象表达式。

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

（2）Click 事件

此事件在 ComboBox 控件上按下然后释放一个鼠标按键时发生，也会在一个控件的值改变时发生。

语法：

Private Sub object_Click([index As Integer])

object：对象表达式。

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

## 应用一：带查询功能的 ComboBox 控件

### 实例说明

如果在下拉列表中的项目过多，想在其中选择需要的项目是很困难的。如果 ComboBox 控件具有查询功能就会很方便。下面将介绍带有查询功能 ComboBox 控件的实例。运行程序。在 ComboBox 控件中输入信息，如果在 ComboBox 列表框中有与之相匹配的信息，即可将全部信息显示在文本框中。如本实例中，在文本框中输入“麻”，由于在下面的列表中有与之相匹配的“麻辣火锅”，则在文本框中可直接显示“麻辣火锅”。实现效果如图 8 所示。

图 8 带查询功能的 ComboBox 控件

### 思路与技术

在实现带查询功能的 ComboBox 控件时，主要应用了 API 函数中的 SendMessage 函数。本实例中利用 SendMessage 函数将参数传递给 ComboBox 控件，以实现查询的功能。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 IParam Any 型，具体取决于消息。

### 开发步骤

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

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

（3）在 Frame1 上添加一个 Label 控件，用于显示提示信息；一个 ComboBox 控件，用于查询信息；一个 Image 控件，用于显示图片，并设置其 Picture 属性。

在窗体中控件说明如表 4 所示。

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

控件名 | 属性 | 值
ComboBox | Name | Combo1
Frame | Name | Frame1
Image | Name | Image1
ListBox | Name Caption | List1 在组合框中输入信息，如果列表中含有与之相匹配的信息，即可显示在文本框中。

（4）为 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

Const CB_FINDSTRING = &H14C

Const CB_ERR = (-1)

'带查询功能的 ComboBox 控件

Private Sub Combo1_KeyPress(KeyAscii As Integer)

Dim Temp As Long

Dim MyStr As String

If Combo1.SelLength = 0 Then

'如果选择的字符为零，将列标框中的文本与键入的字符相组合

MyStr = Combo1.Text & Chr(KeyAscii)

Else '如果选择的字符数不为零

MyStr = Left(Combo1.Text, Combo1.SelStart) & Chr(KeyAscii)

End If

'在列表框控件中查找与变量 MyStr 相匹配的字符串。

'如果找到,则返回值为第一个匹配的字符串的索引值。如果未找到，则返回值为-1

Temp = SendMessage(Combo1.hwnd, CB_FINDSTRING, True, ByVal MyStr)

If Temp <> CB_ERR Then '如果找到

Combo1.ListIndex = Temp '将找到的项目添加到编辑部分

Combo1.SelStart = Len(Combo1.Text) '将光标设置在文本尾部

End If

KeyAscii = 0

End Sub

'窗体启动时将项目添加到 ComboBox 控件中

Private Sub Form_Load()

'向类标框中添加项目

Combo1.AddItem "美式炸鸡": Combo1.AddItem "中国饺子": Combo1.AddItem "冰淇淋"

Combo1.AddItem "春卷": Combo1.AddItem "陕西凉皮": Combo1.AddItem "麻辣火锅"

Combo1.AddItem "四川麻辣烫": Combo1.AddItem "东北饺子王": Combo1.AddItem "香格里拉"

Combo1.AddItem "K F C": Combo1.Text = ""

End Sub

## 应用二：将数据表中的字段添加到 ComboBox 控件

### 实例说明

本实例实现的是将数据表中的字段名添加到 ComboBox 控件中。运行程序，单击“添加”按钮，即可将本实例文件夹下的数据库（db_medicine. mdb）中的数据表（tb_xsd）中的字段添加到 ComboBox 控件中，实现效果如图 9 所示。

图 9 将数据表中的字段添加到 ComboBox 控件

### 思路与技术

要将数据表中的字段添加到 ComboBox 控件，需通过数据集对象提取相应表中的字段的名称并将其保存到 ComboBox 控件中。下面介绍一下 ComboBox 控件的 AddItem 方法。

AddItem 方法用于将项目添加到 ComboBox 控件中。

语法形式如下：

object.AddItem item, index

参数说明：

l object 必需的。一个对象表达式。

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

l Index 可选的。是整数，用来指定新项目或行在该对象中的位置。

### 开发步骤

（1）新建一个标准工程，创建一个新窗体，将其命名为 main_cxtj_sellfind。

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

（3）在 Frame1 上添加一个 Label 控件和一个 PictureBox 控件，并设置 PictureBox 控件的 Picture 属性。

（4）在 Frame1 上添加一个 ComboBox 控件，将其命名为 Cbx_Fields，主要用于存储数据表中的字段信息。再添加一个 CommandButton 控件，将其命名为 Cmd_Add，主要用于执行添加操作。

在 main_cxtj_sellfind 窗体中控件部分属性设置如表 5 所示。

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

控件名 | 属性 | 值
ComboBox | Name | Cbx_Fields
CommandButton | Name Caption | Cmd_Add 添加
Frame | Name | Frame1
Label | Name Caption | Label1 字段名称
PictureBox | Name | Picture1

（5）为 main_cxtj_sellfind 窗体添加如下代码。

Dim fld

Dim rs As New ADODB.Recordset '定义数据集对象

'建立数据库连接

Function cnn() As ADODB.Connection '定义连接函数

'创建连接

Set cnn = New ADODB.Connection

cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\db_medicine.mdb;Persist Security Info=False"

End Function

'单击添加按钮将数据表中的字段名添加到 ComboBox 控件中

Private Sub Cmd_Add_Click() '添加按钮

rs.Open "select * from tb_xsd", cnn, adOpenKeyset, adLockOptimistic

Set fld = rs.Fields

For Each fld In rs.Fields

'向 ComboBox 控件中添加字段

Cbx_Fields.AddItem fld.Name

Next

rs.Close

Cbx_Fields.ListIndex = 0

End Sub

## 应用三：如何将一个 ComboBox 控件放到 Toolbar 控件

Toolbar 控件可以摆放任意 Button 控件。方法都是用 Add 方法将 Button 对象添加到 Toolbar 控件中去。每个按钮的状态都由 Style 属性决定。

例如运行程序 Combo1 控件自动添加到 Toolbar1 工具栏上。

最终效果如图 10 所示。

图 10 将一个 ComboBox 控件放到 Toolbar 控件

★★★★★ Form1 ★★★★★★

程序代码如下：

'窗体启动时将一个 ComboBox 控件放到 Toolbar 控件

Private Sub Form_load()

Dim btn As Button '声明 Button 类型变量

Combo1.AddItem "LOVING" '添加列表项

Combo1.AddItem "李小葱"

Combo1.AddItem "葱葱"

Combo1.Text = "loving" '设置下拉列表项当前内容

Me.Show '显示窗体

Set btn = Toolbar1.Buttons.Add() '添加 Button

btn.Style = tbrSeparator '设置 Button 类型

Set btn = Toolbar1.Buttons.Add() '添加 Button

btn.Style = tbrPlaceholder '设置 Button 类型

btn.Key = "ComboBox" '设置关键字

btn.Width = 1000 '设置宽度

Set btn = Toolbar1.Buttons.Add '添加 Button

btn.Style = tbrDefault '设置 Button 类型

Set btn = Toolbar1.Buttons.Add '添加 Button

btn.Style = tbrDefault '设置 Button 类型

Set Combo1.Container = Toolbar1 设置 Combo1 的所在容器

Combo1.ZOrder 0 '设置 Combo1 位于图层顶端

Combo1.Width = Toolbar1.Buttons("ComboBox").Width '设置 Combo1 宽度

Combo1.Top = Toolbar1.Buttons("ComboBox").Top '设置 Combo1 顶端坐标

Combo1.Left = Toolbar1.Buttons("ComboBox").Left '设置 Combo1 左端坐标

Combo1.Visible = True 'Combo1 可见

End Sub

## 应用四：注意 ComboBox 控件的只读属性

在“工作日志管理”窗体中，单击工具栏上的“添加”按钮添加工作日志信息时（如图 11 所示），弹出如图 12 所示的错误提示信息。

图 11 单击工具栏上的“添加”按钮添加工作日志信息

图 12 在添加工作日志信息时弹出的错误提示信息

在添加工作日志信息时，需要将“日志类型”下拉列表框中的内容清空。“ComboBox”控件的“Style”属性有 3 个属性值，即“0-Dropdown Combo”、“1-Simple Combo”和“2-Dropdown List”。当将“Style”属性设置为“2-Dropdown List”时，“ComboBox”控件的“Text”属性被设为只读，将无法再为控件的“Text”属性赋值，所以在添加工作日志信息时，一旦给“ComboBox”控件的“Text”属性赋予空值，就会弹出错误提示。解决的方法是在“ComboBox”控件的属性窗口中将“ComboBox”控件的“Style”属性设置为“0-Dropdown”，如图 13 所示。

图 13 设置“ComboBox”控件的“Style”属性