3 1
EhLib 是一套 Delphi 第三方组件库,虽然其只有十多个组件,没有 DevExpress 系列那般功能强大,但却简单易用,提供了一些实际开发中非常实用的功能。其中最为代表性的是 DBGirdEh 表格组件。
DBGridEh 可以为你提供一个更加美观和功能丰富的 DBGird,比如平面化显示、奇偶行不同颜色(斑马线)、快速查找、合计行、Grid 打印等。在 Ehlib 的后期版本中,还提供了一个非常强大的过滤功能,他会在 DBGrid 的表头下方显示一个过滤行,用户在此行的相应列中输入查询条件,DBGridEh 可以自动为您筛选出所需要的数据。下图所示即为启用过滤功能后的 DBGridEh:

鉴于之前 EhLib 汉化版发布时,很多人问到 EhLib 过滤功能的实现方式,并要求提供一个示例,所以下面我会简单介绍一下 EhLib 过滤功能的实现,相关代码及可执行文件会发布到 Delphi 盒子,请到那里去搜索并下载。
1、过滤实现的前提条件:uses EhlibADO, EhlibBDE 等 ….
要实现 DBGridEh 的自动过滤,必须先添加 Ehlib 的几个相关 unit 到你的 project 中,如果你使用的是 ADO 连接数据库,请在工程任一 unit 的 uses 列表中添加 EhlibADO,如果使用的是 BDE,请添加 EhlibBDE,其他可能添加的还有:EhlibCDS、EhlibDBX、EhlibIBX、EhlibMTE;
2、启用过滤,显示过滤行:DBGridEh.STFilter.Visible := True
DBGridEh 默认不显示过滤行,设置 STFilter.Visible 为 True 过滤行就显示出来了。
3、选择:客户端还是服务器端过滤?DBGridEh.STFilter.Local = True|False
这一步很主要。客户端过滤也就是 Query 自身的过滤功能,在内存中过滤,不会到服务器端去查询,优点是实现简单,过滤速度快,缺点就是只能获得本地更新的数据,其他用户新增和修改的数据无法实时反映出来。
DBGridEh 服务器端过滤的实现方式是“拼凑”SQL 语句。在过滤之前,DBGridEh 绑定的 Query 的 SQL 语句必须含有 DBGridEh 指定的一个过滤标记,该过滤标记默认为 /*Filter*/,其必须在 SQL 任一行的行首,当用户输入过滤值时,EhLib 生成过滤条件,并且用此条件替换过滤标记之后的内容,然后将新的SQL 语句发送到数据库端去执行,获得的即为过滤后的数据。
具体应该使用哪种过滤方式,需根据实际要求选用。
4、客户端过滤(本地过滤)的实现:DBGridEh.STFilter.Local := True
客户端过滤实现比较简单,而且容易理解,设置 Local 为 True,过滤功能就 OK 了。
5、服务器端过滤的实现:DBGridEh.STFilter.Local := False
服务器端过滤需设置 Local 为 False,然后剩下的就是 SQL 语句,SQL 一般为以下样式:
以上代码生成的 SQL 在 SQL Server 等支持 /* 注释的数据库中会非常正确的执行,但在 Access 中就会出错,解决方案也很简单,更改 DBGridEh 的过滤标记即可:
那么 Query 的 SQL 应该为以下:
服务器端过滤也 OK 了!
注:如果你使用的是 Delphi 2007,你可能会发现当你完全无误按以上设置后,服务器端过滤功能还是无效,这是由于 Ehlib DBUtilsEh 单元的一处 Bug 造成的,此 Bug 产生的原因请查看该文:EhLib 4.1 在 Delphi 2007 下无法过滤和排序的问题。(本示例代码中包含了修正过的 DBUtilsEh,请到 Delphi 盒子下载)
6、过滤行下拉列表的实现:Column.STFilter.ListSource、ListField、KeyField
DBGridEh 的过滤行可以将某列已存在的值以 ComboBox 的形式显示出来,要实现此功能,需设置 DBGridEh 列的 STFilter 属性。将 ListSource 设为要下拉显示的数据源,ListField 为下拉列表显示的字段,KeyField 为构建查询表达式使用的字段。
设置以上属性后,你可能发现虽然下拉列表显示出来了,但选择下拉列表值后,DBGridEh 却没有自动过滤,在单元的 initialization 节添加以下代码即会自动过滤了:
这个方法感觉很奇怪,而且在使用中好像也有问题,当输入 > <这样的表达式时,查询时会出错。在官方的 Demo 中,是通过内存表的方式实现的,而且不用设置任何属性(上面的 ListSource 等都不用设置),即可自动在过滤行每列处显示下拉列表,详细用法请参照 Ehlib 安装目录下的 Demo。
(注:本示例代码不包含过滤行下拉列表的实现演示)
Ehlib 过滤功能实现示例代码下载:Delphi 盒子
23 评论 - "EhLib 使用教程:Ehlib 过滤功能的实现"
DBGridEH在TreeView状态下,如何删除一个节点和这个节点的所有子节点?
To Sonic:
直接 Delete 不可以吗?Ehlib 自带的那个 Treeview 的 Demo 就绑定了一个 DBNavigator,和普通的 Query 操作一样。
因为感觉效果一般,所以一直没太研究过 Ehlib 的内存表和那个 TreeView,真的是不太了解那方面的东西
我就是看了那个DEMO来做的,DEMO中确实可以删除节点的同时删除其所有子节点,但是我自己做的就不行,只能删除本节点,不知道原因何在。想和你讨论一下,QQ:17661796
我刚才又试了一下,发现那个DEMO也不能删除其所有子节点,呵呵,搞得真是头晕的。
不知道你有没有什么更好的方法。
To Sonic:
我试了那个 Demo,可以删除节点下的子节点啊。
不行,你仔细看,删除后子节点在最后一行。“可删除”是表现。
我试了一下,果然是跑下面去了
要不就自己写代码,递归删除吧。
我用了ehlibado,模糊过滤可以的,用了ehlibcds,模糊过滤中文不行,大家有没有发现?数字,英文可以的
中文模糊过滤有问题并不是 Ehlib 的问题,因为 Ehlib 的过滤的原理还是 Query 的过滤机制,Delphi 在这方面的确是有一些问题。
面对面,对于这样CDS的问题,你有没有好的方法,让它支持中文,或者变通的方法也可以
ClientDataset 在处理中文 LIKE 时确实有问题,网上讨论很多,也有一些解决方案,你可以 Google 一下,我记得 Delphibox 上也有相关的解决代码。
但我建议你如果程序需求允许的话,最好是用 SQL 查询代替过滤机制。
你也可以参考一下这篇帖子:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=583696
谢谢你,大哥,辛苦你了
我做过滤怎么没有反映啊?我的Ehlib放在了frame中的,DBGridEhCenter.FilterEditCloseUpApplyFilter := True; 设了也没有反映
Ehlib 过滤这块的确问题多,我经常用 Ehlib,但一般都是用 SQL 服务器端查询,这样的话很多问题就能自己处理,自动过滤那些都是自己实现,很少用 Ehlib 自带的,自带的异常无法捕捉,处理起来很困难;而且过滤这块的确有很多 Bug,连续好几个版本都未修正过。
Ehlib 这个组件是不错,虽然有源代码,但因为作者更新率太低,所以不建议把太多功能依赖到这个组件上。
我好像用服务器端过滤也没有用嘛,我想知道DBUtilsEh.SQLFilterMarker := ‘(1>0)AND’;是这什么意思?为什么AdoQuery.SQL.Text := ‘SELECT * FROM Students WHERE ‘ + #13 + ‘(1>0)AND 1=1′;还要这样设置?
终于找到答案了,
在USES段添加EhLibADO或EhLibBDE;
如果用的ADO控件添加EhLibADO,如果用的是BDE控件添加EhLIBDE.
因为 Ehlib 的服务器端过滤是拼凑 SQL 语句,所以他在 SQL 语句内需要一个标记来更新用户输入的条件。
加 EhlibADO 等是必须的,这篇文内说明了,看来我白写了,呵呵~~
不是你白写,是Ehlib太怪异,明明没用到,还要加那个单元(虽然实际上是用到的。):(
请教一下博主,按照您的方法,如何实现模糊过滤呢?
例如,我是在本地过滤实现过滤的
DBGridEh.STFilter.Local := True
DBGridEh.STFilter.Visible := True
之后,如何再实现过滤之前,再用户的关键字加上通用符?
to ken:
Ehlib 原版不是模糊过滤。
偶一直在汉化 Ehlib,汉化后的版本默认是模糊过滤的,看这里:
http://www.faceker.com/200712/ehlib-4216-cn-release.html
可到 Delphibox 下载。
我发现的问题:DBGrideh排序或过滤后,另外一个地方采用相同数据集的控件就会出错。
留言评论