是否可以更改TClientDataSet
中用于排序记录的索引的方式?阅读this question之后,我认为能够在客户端数据集中对字符串字段进行逻辑排序会很不错。但是我不知道如何在索引时覆盖客户端数据集的默认行为。有什么想法吗?
PS:我的CDS未链接到任何提供商。我正在寻找一种方法来修改TClientDataSet
(或实现机制的父级)本身的排序机制。
答案 0 :(得分:5)
您不能覆盖ClientDataSet的排序机制 - 除非您重写Midas的相应部分。
要实现正确的排序(无论逻辑意味着什么),您可以引入一个新字段并以某种方式设置其值,以便使用标准机制排序,它们将提供所需的排序顺序。
答案 1 :(得分:2)
按Understanding ClientDataSet阅读优秀的在线文章Cary Jensen索引。
它解释了如何使用IndexDefs,IndexFieldNames和IndexName使用各种排序和索引方法。
修改:回复您的评论。
您无法覆盖TClientDataSet中的排序方法,但可以添加:
如果您想对除现有字段之外的任何内容进行自定义排序,则必须添加Calculated Field,在OnCalcFields事件中执行一种订单计算,然后将该字段添加到IndexDefs
。
答案 2 :(得分:1)
我会尝试使用提供ClientDataSet的SQL语句来实现所需的排序。
例如,如果我在FieldN中处理以下字符串
a_1
a_20
a_10
a_2
我希望它们像这样排序(我假设这类似于你的意思逻辑
a_1
a_2
a_10
a_20
然后我会把SQL写成
SELECT FieldA,
FieldB,
... ,
FieldN,
CAST(SUBSTRING(FieldN, 3, 2) TO INTEGER) As FieldM '<== pseudocode
FROM TableA
ORDER BY FieldM
SubString和Cast to Integer操作的确切语法取决于您使用的DBMS。