2010-06-30 197 views
2

迄今为止,我知道在ClientDataSet中的排序工作在indexDefs上。 我可以添加一个indexDef,设置我想要排序的字段,并通过ixDescending属性定义要排序的方向。Delphi TClientDataSet排序(插入)问题

我有一个ClientDataSet连接到一个数据源,这是一个DBGrid的源。 当我现在在ClientDataSet中插入一条新记录时,它会插入到表的顶部(ixDescending = false)或表的底部(ixDescending = true)。

但我想要一个降序,新的记录应该在表格顶部 - 而不是在底部。 我试图在运行时更改indexDefs来实现此目的 - 但没有成功。 有人有一个想法如何做到这一点?

回答

0

如果您已经插入记录,除非您为索引字段设置了值,则它们为NULL,并进行相应排序。

+0

我不明白 - 当我没有为索引字段设置值时,顺序是上升的。在插入新记录之前,我需要降序。 – ben 2010-07-01 05:26:27

+0

问题可能是ClientDataset如何处理索引中的NULL值。它们可以被认为大于或小于任何其他值。如果CDS使用后一种约定,并且您使用降序,则索引字段中具有NULL值的记录将放在底部。 – 2010-07-01 09:53:19

+0

你当然是对的。我已经选择了另一个索引字段,现在在发布新记录之前填充它,现在它在那里它应该是 - 谢谢;) – ben 2010-07-01 18:46:37

0

我不知道一个优雅的解决方案(虽然我在这方面是新手。)

也许有一些方法可以让你在你的ClientDataSet创建临时布尔场...( )可能是一个计算的字段?)假设你命名新字段“NewRecord”并将其包含在IndexDef中,以便它是最重要的排序标准。

在.OnCreate事件中,您将其设置为true(内部会是1?)。在.OnPost事件中,您将其设置为false。

如果您不想依赖布尔值的内部表示,那么您可以创建一个字符串字段并将“ZZZZZZZ”放入其中。或者是一个整数字段,并将MaxInt放入其中。