最簡便的方式就是在 ClientDataSet 的 IndexFieldNames 屬性指定要排序的欄位, 如:
ClientDataSet.IndexFieldNames := 'custname';
如果要排序的欄位有 2 個以上, 則欄位名稱以分號隔開, 如:
ClientDataSet.IndexFieldNames := 'custname; id';
不過這方法比較陽春, 僅能指定欄位, 不能指定排序方式為 ASC 或 DESC.
若要達到有 ASC / DESC, 則要用 IndexName.
要使用 IndexName 前, 先要建立 IndexDefs.
如下圖, 填入欄位名(同樣地, 若有 2 個欄位要排序, 則欄位間以分號隔開), 並為排序命名後, 再回去點 ClientDataSet 元件, 這時就可看到 IndexName 屬性的下拉列表內有我們剛新增的排序名.
在
上圖的 Object Inspector 內, Options 屬性底下有 ixDescending 的選項, 當 ixDescending 為
True 時, 即為 Desc 遞減排序, ixDescending 為 False 時, 則為 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 明白說到, IndexName 及 IndexFieldNames 並不一定適用於所有各類型的資料表, 所以這些功能還是要自行以各種模式去踹才知道...
沒有留言:
張貼留言