ACCESS 说说组合框的应用

发布时间 2023-08-15 08:47:12作者: 一曲轻扬

在说应用之前,我觉得很有必要先讲讲组合框的一些常用属性:

1.Dropdown : 显示下拉菜单.这个属性可以在VBA下主动显示出来,但如果要隐藏它,只能通过转移焦点来达成.

ComboObj.Dropdown

2.AutoExpand : 这是个布尔值,默认为True.一般会在Load事件中设置好.当用户输入的值与列表中的值相似时,组合框将会自动匹配并上屏

ComboObj.AutoExpand = False

光看代码可能理解不来,我给个动画吧:

下面这种是值为True(默认)时的情形.可以看到,我只打了个"布"字,后面就自动补全为"布依族".这种设计很方便,但是如果有些场合是不适用的.比如用SQL智能查询时,拿到的结果可能有多个,如果这个功能打开了,会导致结果只有一个显示出来.所以此时这个功能要设置成False,后面会详细讲到.

 

下面是我在Load事件中设置为False的情形.可以看到,补全功能被关闭了.

3.ListIndex.使用 ListIndex 属性,设置组合框中选择菜单中的选项。 只读 Long。此属性只能通过使用宏或 Visual Basic 使用.它的下标是从0开始的.还有,使用它有个前提,就是组合框必须要先获得焦点,不然就会提示"您错误地使用了ListIndex"

4.RowSource.就是 数据 选项卡下的 行来源 属性,它是用来设置下拉菜单的.它的表达方式受 下面一个属性 行来源类型决定,这是官方资料:ComboBox.RowSource 属性 (Access) | Microsoft Learn

 一般用法:

Me.Combo0.RowSource = "Select [民族] FROM 民族"

5.ControlSource 与上面的 RowSource 属性不同.使用 ControlSource 属性可指定控件中显示的数据。 可以显示和编辑绑定到表、查询或 SQL 字符串/语句中的字段的数据。 您还可以显示表达式的结果。 读/写 String。ComboBox.ControlSource 属性 (Access) | Microsoft Learn

我当时开始玩ACCESS时,经常被ControlSource 与RowSource 搞混,所以摆在这里,让大家看清楚.

6.说说下面两个图片中这几个属性的作用.

 

 

 列数: 设置下拉菜单有几列.注意: 设置几列是一回事,显示几列又是另外一回事,也就是说有些列可以设置成不显示出来,往下看

列宽: 如果我列数设置成了4,然后列宽这里设置成: 0CM;0CM;2CM;0CM  大家想一想,它会显示出来几列? 答案是1列.宽度设置成0的列都会被隐藏起来

列标题: 就是表头,像这样:

 列表行数: 这个似乎没什么可说的,就是列表最多显示多少行记录

列表宽度:字面意思

绑定列: 当用户选中菜单时,返回第几值的值. 注意,这里是从1开始.而它的另外一个属性Column则是从0型

限于列表: 就是只能选择菜单内的选项,不允许用户再输入其他值

允许编辑值列表:  当  行来源类型  属于  值列表  时,用户可以往列表里追加选项.其他情况下不支持.如下图,如果这个选项有打开,会显示个编辑的图标:

 

 

 

 

下面来做几个常见的组合框的应用.

一.用SQL语句来智能提示记录.我们还是用 民族 这个表来做.

  需求:

  1.在组合框内输入关键时,智能过虑下拉菜单.

  2.用户可以按上下方向键来选择数据.这个需求看似有点多余了,因为我们日常中用到的,都是可以按上下键来选择.但是在这个场景下,它是有问题的.因为我们会用到Change事件,按上下键时,选项会自动上屏,再次触发change事件.所以就要处理这个按键的问题了.

以下是全部代码与效果展示:

Option Compare Database
Dim cf As Boolean   '开关变量,这里是局部变量,只能在本窗体内可见
Private Sub Combo0_Change()
    If Not cf Then Exit Sub '用一个开关变量来决定是否进行过虑
    Dim txt As String
    txt = Trim(Me.Combo0.Text)
    Me.Combo0.RowSource = "Select [民族代码],[民族] FROM 民族 WHERE 民族代码 & '|' & 民族 like '*" & txt & "*'"     '设置匹配规则
    Me.Combo0.Dropdown  '更新并显示下拉菜单
End Sub

Private Sub Combo0_KeyDown(KeyCode As Integer, Shift As Integer)
    cf = Not (KeyCode = vbKeyUp Or KeyCode = vbKeyDown)     '当用户按下 上下  方向键时,设置开关为关闭状态,避免执行Change事件
End Sub

Private Sub Form_Load() '初始化变量
    cf = True
    Me.Combo0.AutoExpand = False
    Me.Combo0.RowSource = "Select [民族代码],[民族] FROM 民族"
End Sub

我这里绑定的列是第一列.所以会返回一个民族代码,而不是民族这个字段

 

  第二个场景.在数据表中应用组合框.本例无代码,全靠操作即可完成.也可以不用SQL语句,直接设置成值列表

我有一个 员工  表,设计视图如下:

 效果如下:

 

 第三个场景: 这个场景严格来说应该与组合框无关,算是技巧吧.比如我们做了一个可以筛选部门的功能,如果是用 值列表 直接把值写死了,这个没什么难度,但是后期维护麻烦.所以我们一般是用SQL来做,比如:

Select 部门编号,部门 From 部门;

 这也不难,对吧.但是,大家有没有想过,如果我要显示全部的部门怎么办?部门里面也没有全部这个值啊,怎么办?留空的话,先不说用户能不能理解吧,起码,它就很丑,对不对?所以我们把这条SQL稍微改造一下,变成:

 

 

Select 0,"全部" From 部门
Union 
Select 部门编号,部门 From 部门;

 第四个场景.对Column属性的应用.这个属性是用来取当前选项的其他列的值的.上面例子中,多都使用到了 多列  的方式来展现下拉菜单,有些甚至还是隐藏的,要取他们的值,就要用到column这个属性

  在开始之前,我还要说一个组合框的属性: columns 这货就是用来统计有多少列的,不要跟上面这个不带S的属性搞混.鬼知道我经历了什么才会跟你们讲这个属性.

  取上一个图为例,当用户选择了"全部" 菜单时,

  me.combo0.value => "全部"

  me.combo0.column(0) => 0  .这里注意一下,column的下标是从0开始的

  me.combo0.column(1) => "全部"

  ....以此类推

我在刚刚开始用这个控件时,都是很粗糙的下拉用一列展现数据,后来我发现,当我选中 "人事部"时,我还要去取它的"部门编号",然后用DLookup去取...真是太傻了.直到我学会了用column,我直接把有用的数据直接拉到选项里.需要的就让它显示,不需要的就隐藏它,真是太爽了

第五个场景: 在多个组合框之间进行联动,最常见的是省市区选择模块,比如:

 这个图是我网上找的,因为我并不给写这么复杂的例子[狗头].这种联动多发生在上下级,有所属关系的场景中.

我以我开发过程中的仓库为例,来为大家做个演示吧

 表设计如下:

 

 设计思路:

1.设置下拉菜单显示为2列,分别是WHID,仓库名称,列宽设置为 0,4  .绑定第2列(这里看不明白同学,上面有讲过了)

 

2.主仓库肯定是不包含子仓库的,所以我得把主仓库分离出来,也就是把 父级ID=2 的记录提取出来.设置主仓库的组合框控件的行记录来源设置为:

SELECT WHID, 仓库名称 FROM 仓库列表 WHERE 启用状态=-1 and 父级ID=2 ORDER BY WHID; 

3.设置子仓库.子仓库的联动来源于主仓库的变化,所以会使用到主仓库"更新后"事件

 

Private Sub cpwh_AfterUpdate()
    '获得仓库前缀
    iWHID = cpwh.Column(0)    '拿到主仓库的ID
    '设置子仓库
    cpwh2.Value = Null
    '按不同的仓库设置不同的联动数据
    If cpwh.Value = "成品仓" Or cpwh.Value = "半成品仓" Then
        cpwh2.RowSource = "SELECT 客户名称 from 客户列表 where 启用状态=-1"
    Else
        cpwh2.RowSource = "SELECT 仓库名称 from 仓库列表 where 启用状态=-1 and 父级ID=" & iWHID
    End If
    cpwh2.Requery  '刷新控件数据
End Sub

以上就是今天的内容.如果有写得不对的地方,请大家多多指教.后面如果有其他新应用或者技巧,我再补充上来