打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
用DBGridEh实现点击列头自动排序数据
我使用的环境是Delphi7+IBX+EhLib3.6, 按EhLib的说明,DBGridEh不用专门写排序代码就可以实现点击列头自动排序数据,看它提供的Demo确实如此。但昨天搞了半天才搞定,发现还有一些细节设置需要注意。

一般给出的步骤都是这样:设置好DBGridEh数据集的连接后,
1、双击该组件,在其弹出的属性编辑器中添加相关字段;
2、将该组件的[OptionsEn]中的dghAutoSortMarking和dghMultiSortMarking属性设置为True;
3、将要排序的字段的属性列表的[Title]的TitleButton属性设置为True;
4、编译时一定要在uses子句中加上EhLib/DataService下相应的EhlibXXX单元。

使用多字段排序: dghMultiSortMarking要选true, 然后点击一列,然后按住ctrl,点其他列,则列标题会出现1,2的顺序标志,松开ctrl后排序起作用。
(TDBGridEh allows to show special sortmarking bitmaps (small triangles) in the right part of title cell. In order to automatically marking title by sortmarking bitmaps add dghAutoSortMarking to OptionsEh property. Add dghMultiSortMarking too in order to allow sortmarking several columns simultaneously. Set Column.Title.TitleButton to true for titles which will have possibility to change sortmarkers at run time. At runtime clicking on title will change sortmarking. Holding Ctrl key allows to mark several columns simultaneously. After user change sormarking grid call OnSortMarkingChanged event. You can write this event to change sorting and reopen in dataset. Use SortMarkedColumns property to access to sortmarked columns.)

至此就可以了,似乎很简单。但我按照这样的步骤设置后一运行就出现动态SQL语句错误。看了下EhLibIBX.pas(我用的是IBQuery),原来,TDBGridEh实现自动排序是TSQLDatasetFeaturesEh查找TIBQuery.SQL中以'ORDER BY'开头的行,然后替换这一整行为 'ORDER BY FieldNo1 [DESC],....'。所以,注意:如果TIBQuery.SQL中已经有'ORDER BY'语句,一定要让这一句单独占一行,否则TDBGridEh会把其他SQL语句也替换掉; 或者原本就没有'ORDER BY'语句,这样也能自动排序成功。

还要注意,上面的FieldNo1是要排序的字段的序号,而不是字段名。比如'SELECT NAME,AGE FROM TABLE_EMPLOYEE ORDER BY 2',就是对AGE字段排序。但是一定不能写成'SELECT * FROM TABLE_EMPLOYEE ORDER BY 2',否则就会出现无法定位字段位置的SQL错误!所以,TIBQuery.SQL中一定要明确写出查询的字段,而不能用'*',这样TDBGridEh才能成功执行自动排序。这个好象应该算SQL语法规则,发现自己基本的SQL语法还是很菜,呵呵,让我试了半天|||^_^...

其他数据库组件也是一样的(除了ClientDataSet),也都是重写SQL,在服务器端重新执行一次查询实现排序。这个我想效率一定不好,怪不得很多高手还是愿意自己写代码实现点击列头自动排序的功能。但如果使用ClientDataSet,可以设置TDBGridEh.SortLocal:=True实现本地排序。EhLib4好象专门增加了内存表组件,应该可以用它实现本地排序了。

以下翻译来自EhLib/DataService/readme.txt

“在 Ehlib 的 DataService 文件夹下提供了一些可以使数据集实现自动排序的文件。TDBGridEh 使用这些文件中的相关对象可以实现当排序标记发生变化时实现自动排序。
“如果你改变了数据网格及标题的排序标记而没有书写 OnSortMarkingChanged 事件,数据网格将尝试自动进行数据排序。
“DBGridEhDataService尝试通过 GetDatasetFeaturesForDataSet 查找 TDataSet 中可以排序的特定的对象。正如你所知道的,TDataSet 不支持数据排序,但它的派生对象 TQuery 或 TClientDataSet 却允许实现数据排序。

“使用过程 RegisterDatasetFeaturesEh ,你可以注册 TDatasetFeaturesEhClass 类对指定的数据集排序。

“EhLib已经实现了能在TQuery, TADOQuery 和TClientDataSet对象中排序数据的类。简单地通过 uses 子句添加 Ehlib...(EhlibBDE,EhlibADO,EhlibCDS)的单元之一到你的工程的任意单元中,与它们相连的数据网格将自动对该数据集进行排序。 EhLibBDE, EhLibADO, EhLibCDS 通过在单元数据集中调用 RegisterDatasetFeaturesEh 过程来实现初始化。
“对于其它数据集类型,你必须编写、并注册可以实现该数据集排序的新对象。书写过程 T[你的数据集]DatasetFeaturesEh.ApplySorting ,你可以存取那些使用了 SortMarkedColumns 属性的列以实现直接排序。你可以查看 DbUtilsEh 单元中的示例以明白如何编写T[你的数据集]DatasetFeaturesEh 类及查看 EhLibBDE 单元以明白如何注册 T[你的数据集]DatasetFeaturesEh 类。

引擎 数据集 单元文件

BDE TQuery EhLibBDE

ADO TADOQuery EhLibADO

ClientDataSet TClientDataSet EhLibCDS

DBExpress TSQLQuery EhLibDBX
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
DBGridEh使用技巧
DbgirdEh的一些用法
转载DBGrid和DBGridEH
DbgridEh的一些用法(三)
dbgrideh的drawroll
ELIB排序函数
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服