在说应用之前,我觉得很有必要先讲讲组合框的一些常用属性:
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
以上就是今天的内容.如果有写得不对的地方,请大家多多指教.后面如果有其他新应用或者技巧,我再补充上来
标签:Sub,应用,组合,仓库,列表,ACCESS,RowSource,设置,属性 From: https://www.cnblogs.com/yoooos/p/17628588.html