利用列表框实现多层查询

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)

好的,大家快去试一下吧

 

 

 

posted @   edonsoft  阅读(28)  评论(0编辑  收藏  举报  
编辑推荐:
· .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 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示