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 里面的記錄順序確實恢復到了排序之前的順序。
進一步討論
其實,有必要取消排序,恢復到原始混亂的排序嗎?
對用戶來說,其實他需要的是各種排序。比如先按照名字排序,看完了,可能想按照性別排序來看。看完了,可能想按照年齡排序來看。因此,只需要對各個字段設置為可以點抬頭排序就好了。實在想不出來有什么需求,是要看原始混亂排序的順序的。