利用列表框实现多层查询
Hi,手机边亲爱的你还好吗?
我是Mary杨,今天给大家来个”硬菜“,给大家分享一个多层查询示例。
一般来说在窗体中实现查询功能有两种方式:一种是先加载所有记录,然后通过窗体的筛选器对记录集数据进行筛选来实现查询功能;另一种方式是将窗体的记录源设为SQL语句,动态改变该SQL语句的WHERE条件子句来实现查询。
01、创建表
现在通过示例程序来对其进行说明,由于此功能是对数据的处理,所以需要基于一个有数据的表,这里我们用如图1、图2所示的“产品”表来做为例程表:
(图1)
(图2)
02、创建窗体
我们需要根据表中的“供应商”和“类别”来进行多层查询,首先基于该表用向导创建一个数据表视图的窗体(图3),将其命名为“子窗体”:
(图3)
然后再创建一个空白窗体,向窗体中添加控件,完成后的效果如图4所示:
(图4)
控件类型 | 控件名称 | 其它属性 | 其它说明 | |
属性名 | 属性值 | |||
列表框 | lstProvider | 行来源类型 | 表/查询 | 显示供应商列表 |
行来源 | SELECT TOP 1 ‘(全部)’ FROM 产品 UNION SELECT DISTINCT 供应商 FROM 产品; | |||
默认值 | “(全部)” | |||
更新后 | [事件过程] | |||
标签 | lstProvider_Label | 标题 | 供应商 | 绑定标签 |
列表框 | lstSort | 行来源类型 | 表/查询 | 显示产品类别列表 |
行来源 | SELECT TOP 1 ‘(全部)’ FROM 产品 UNION SELECT DISTINCT 供应商 FROM 产品; | |||
默认值 | “(全部)” | |||
更新后 | [事件过程] | |||
标签 | lstSort_Label | 标题 | 产品类别 | 绑定标签 |
子窗体 | fsubDetail | 源对象 | 子窗体 |
03、添加代码
这里列表框的行来源中的SQL语句是一个联合查询,其表示的含义是:
SELECT TOP 1’(全部)’ FROM 产品 (这一句就是用于把“(全部)”这一项添加到列表中)
SELECT DISTINCT 供应商 FROM 产品 (这一句是从产品表中取供应商字段的数据,DISTINCT关键字的用途是排除重复值)UNION关键字的作用是把两个结构相同的表中的数据合并(重复值被排除)然后我们在此窗体的类模块中加入以下子过程:
Sub ApplyFilter()
Dim strWhere As String
If Me.lstProvider <> "(全部)" Then strWhere = "供应商='" & Me.lstProvider & "'"
If Me.lstSort <> "(全部)" Then strWhere = strWhere & " AND 类别='" & Me.lstSort & "'"
If strWhere <> "" Then
If strWhere Like " AND *" Then strWhere = Mid(strWhere, 6)
Me.fsubDetail.Form.Filter = strWhere
Me.fsubDetail.Form.FilterOn = True
Else
Me.fsubDetail.Form.Filter = ""
Me.fsubDetail.Form.FilterOn = False
End If
End Sub
前面这个是用筛选器实现的方法,如果要用重置记录源的方法,则子过程的代码如下:
*请注意这里的区别
Sub ApplyFilter()
Dim strWhere As String
If Me.lstProvider <> "(全部)" Then strWhere = "供应商='" & Me.lstProvider & "'"
If Me.lstSort <> "(全部)" Then strWhere = strWhere & " AND 类别='" & Me.lstSort & "'"
If strWhere <> "" Then
If strWhere Like " AND *" Then strWhere = Mid(strWhere, 6)
strWhere = " WHERE " & strWhere
End If
Me.fsubDetail.Form.RecordSource = "SELECT * FROM 产品" & strWhere
End Sub
从上面两个子过程的代码中我们可以看到其实两种方法实现起来非常相似,其中生成的条件字符串完全是一样的。
那种两种方式有什么差别呢?
使用筛选器方法数据只加载一次,在关闭窗体之前所有的筛选都是对保存在内存中的记录集进行操作,这样在网络环境中应用时减少了网络通信的频率;
而使用重置数据源的方式一般每次只加载一部分数据。
所以筛选器方式用在数据量不是太大但查询频繁的情况,重置数据源的方式则用在数据量大但查询不频繁的情况。
由于我们需要在2个列表框任意一个选中后对数据进行查询,所以我们需要在两个列表框的更新事件中对这个子过程进行调用:
Private Sub lstProvider_AfterUpdate()
Call ApplyFilter
End Sub
Private Sub lstSort_AfterUpdate()
Call ApplyFilter
End Sub
04、运行
最终实现的效果如图5所示:
(图5)
好的,大家快去试一下吧!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义