DBGridEh 可以点列抬头使得记录按该列排序
不需要写代码,只需要设置好,它就能排序。
网上的文章一般写了如何设置。但一般都少说了一条。
先说如何设置:
1. OptionsEh.AutoSortMarking 设置为 True,如果是设计期属性面板,就是打勾;
2. 如果要按多个字段排序,则:OptionsEh.dghMultiSortMarking 打勾;
3. SortLocal 打勾;
4. 如果是设计期,为 DBGridEh 创建固定字段(Columns),选中要排序的字段,在其属性面板找到:
4.1. Title.TitelButton 打勾;
4.2. Title.SortMarker 可以选择默认值,也就是没排序箭头。但当执行完排序,这个箭头会显示出来。
5. 重点来了:如果这个 DBGridEh 对应的 DataSet 是 ClientDataSet,就需要在它所在的单元 uses EhlibCDS
为啥要 uses EhlibCDS
请参考以下这段话:
EhLib已经实现了能在TQuery, TADOQuery 和TClientDataSet对象中排序数据的类。简单地通过 uses 子句添加 Ehlib...(EhlibBDE,EhlibADO,EhlibCDS)的单元之一到你的工程的任意单元中,与它们相连的数据网格将自动对该数据集进行排序。 EhLibBDE, EhLibADO, EhLibCDS 通过在单元数据集中调用 RegisterDatasetFeaturesEh 过程来实现初始化。
对于其它数据集类型,你必须编写、并注册可以实现该数据集排序的新对象。书写过程 T[你的数据集]DatasetFeaturesEh.ApplySorting ,你可以存取那些使用了 SortMarkedColumns 属性的列以实现直接排序。你可以查看 DbUtilsEh 单元中的示例以明白如何编写T[你的数据集]DatasetFeaturesEh 类及查看 EhLibBDE 单元以明白如何注册 T[你的数据集]DatasetFeaturesEh 类。
大概意思:DBGridEh 实际上是依靠它对应的 DataSet 去排序的。TDataSet 本身没有实现排序功能,但它的子类,比如 TClientDataSet 实现了排序功能。因此,如果要它自动排序,需要引用它提供的对应该 DataSet 的排序单元。如果你使用的 DataSet 不是它支持的,就要自己去实现,并注册。
概念
Delphi 的数据敏感控件,比如 DBGrid 或者 DBGridEh,通过 DataSource 指向一个 DataSet;数据敏感控件本身仅仅是用于数据的显示,它并不拥有数据,也不管理数据。所有对数据的操作,都是在操作 DataSet。
因此,表面上看,点击的 DBGridEh 的字段抬头后,里面的数据排序了。但实际上,是它背后的 DataSet 里面的数据排序了。
进一步的测试
有人想要点击 DBGridEh 的字段抬头排序以后,还想要在排序后可以取消排序,恢复 DBGridEh 里面的记录的原来的排列顺序。
基于以上排序的原理,可以知道,排序实际上是对 DataSet 而言的。因此,使用以下代码测试:
procedure TForm1.Button3Click(Sender: TObject);
beginShowMessage(ClientDataSet1.IndexFieldNames);ShowMessage(ClientDataSet1.IndexName);
end;
程序运行后,用户点击 DBGridEh 的字段抬头排序之前,点击 Button3 执行上述代码,弹出来的对话框是空的。
用户点击 DBGridEh1 的字段抬头排序之后,运行上述代码,可以看到:
1. ClientDataSet1.IndexFieldNames 仍然是空的;
2. ClientDataSet1.IndexName 为:SortIndexEh
说明当用户点击 DBGridEh 的字段抬头,DBGridEh 自动为记录排序时,实际上它是为它对应的 ClientDataSet1 增加了一个索引!
因此,取消排序就简单了:
procedure TForm1.Button4Click(Sender: TObject);
beginClientDataSet1.IndexName := '';
end;
执行完上述代码,可以看到,DBGridEh1 里面的记录顺序确实恢复到了排序之前的顺序。
进一步讨论
其实,有必要取消排序,恢复到原始混乱的排序吗?
对用户来说,其实他需要的是各种排序。比如先按照名字排序,看完了,可能想按照性别排序来看。看完了,可能想按照年龄排序来看。因此,只需要对各个字段设置为可以点抬头排序就好了。实在想不出来有什么需求,是要看原始混乱排序的顺序的。