【Delphi】ClientDataSet 的排序

最簡便的方式就是在 ClientDataSetIndexFieldNames 屬性指定要排序的欄位, 如:

ClientDataSet.IndexFieldNames := 'custname';

如果要排序的欄位有 2 個以上, 則欄位名稱以分號隔開, 如:

ClientDataSet.IndexFieldNames := 'custname; id';

不過這方法比較陽春, 僅能指定欄位, 不能指定排序方式為 ASCDESC.

若要達到有 ASC / DESC, 則要用 IndexName.

要使用 IndexName 前, 先要建立 IndexDefs.



如下圖, 填入欄位名(同樣地, 若有 2 個欄位要排序, 則欄位間以分號隔開), 並為排序命名後, 再回去點 ClientDataSet 元件, 這時就可看到 IndexName 屬性的下拉列表內有我們剛新增的排序名.



在 上圖的 Object Inspector 內, Options 屬性底下有 ixDescending 的選項, 當 ixDescendingTrue 時, 即為 Desc 遞減排序, ixDescendingFalse 時, 則為 Asc 遞增排序; 另外, 再往上看, 有個 DescFields 屬性, 這是當 Fields 為 2 個欄位以上時, 若其中有個欄位是要 Desc 的, 比如說 sex 欄位, 則

Fields 填入 sex; name

而 DescFields 填入 sex

這是在程 式開發時期所做的設定, 執行時期呢? 也是看上圖的程式碼, 是一個 button click 時所變更的排序方式, 不過這種方式的缺點是必須 Options 改變前要先將 ClientDataSet.Close, 改變後再 ClientDataSet.Open.

若想在 ClientDataSet 不關閉的情況下變更排序方式, 不妨考慮建立 2 個 IndexDefs, 一個是 Asc, 一個是 Desc, 這樣在程式執行時期, 要變更排序方式, 只要

ClientDataSet.IndexName := '排序名';

就馬上變了.

如果連資料來源都是得在程式執行時期才知道, 需要動態建立呢? 可以使用 AddIndex, 如下:

ClientDataSet.AddIndex('排序名', 要排序的欄位, Options, 指定要 Desc 排序的欄位名, 英文大小寫有分別的欄位, 要群組的層級);

ClientDataSet.AddIndex(Edit1.Text + 'Index', Edit1.Text, [ixCaseInsensitive],'','',0);


在 Delphi 的 Help 明白說到, IndexNameIndexFieldNames 並不一定適用於所有各類型的資料表, 所以這些功能還是要自行以各種模式去踹才知道...