Delphi ClientDataSet 通过更改 IndexName 进行排序
Delphi ClientDataSet Sorting by changing IndexName
我一直在了解 delphi 中的 ClientDataSet 以及它如何帮助对我的 SQL 数据库进行排序。数据在我的 TDBGrid 中显示正常,我通过更改 ClientDataset 的 IndexField 单击 header 启用了排序。有时我想让它在排序上下降,所以一直在尝试使用这里列出的 2 个 IndexNames
但是,当我将 IndexName 从 DEFAULT_ORDER 换成 CHANGEINDEX 时,我的 DBGrid 中的所有数据都消失了。我对所有这一切都很陌生,我知道这将取决于我的情况,但发生这种情况的方式有哪些,我将尝试解决这些问题。
我有 1 个 TSQLConnection 连接到 TSQLQuery,那个连接到 TDataSetProvider,那个连接到我的 ClientDataSet,它导致 TDataSource 到 TDBGrid。为什么通常很好的 ClientDataSet 在我更改名称时可能会出现问题?请记住,大多数设置都是默认设置,因为我对这些组件不太确定。谢谢,我希望你能提供一些有用的帮助,很抱歉我的情况可能很难理解。
托比
ClientDataSet 带有两个预定义索引:DEFAULT_ORDER 和 CHANGEINDEX,它们对您的任务没有实际用处,因为您无法根据需要调整它们。所以你必须创建自己的索引。可以在 this article as well as in his highly recommended book about ClientDataSets.
中找到 Cary Jensen 的全面描述
我使用以下代码为客户端数据集构建索引:
Procedure BuildIndices (cds: TClientDataSet);
var
i, j: integer;
alist: tstrings;
begin
with cds do
begin
open;
logchanges:= false;
for i:= 0 to FieldCount - 1 do
if fields[i].fieldkind <> fkCalculated then
begin
j:= i * 2;
addindex ('idx' + inttostr (j), fieldlist.strings[i], [], '', '', 0);
addindex ('idx' + inttostr (j+1), fieldlist.strings[i], [ixDescending], '', '', 0);
end;
alist:= tstringlist.create;
getindexnames (alist);
alist.free;
close;
end;
end;
因此,有一个索引 'idx0' 用于对第 0 列进行升序排序,'idx1' 用于对第 0 列进行降序排序; 'idx2' 和 'idx3' 用于第 1 列等
然后,在网格的 OnTitleClick 事件中,我有以下内容
procedure Txxx.DBGrid1TitleClick(Column: TColumn);
var
n, ex: word;
begin
n:= column.Index;
try
dbgrid1.columns[prevcol].title.font.color:= clNavy
except
end;
dbgrid1.columns[n].title.font.color:= clRed;
prevcol:= n;
directions[n]:= not directions[n];
ex:= n * 2;
if directions[n] then inc (ex);
with clientdataset do
try
disablecontrols;
indexname:= 'idx' + inttostr (ex);
finally
first;
enablecontrols
end;
end;
在每种形式中,我定义了一个布尔数组 ('directions'),每个网格列一个元素。这些元素跟踪列是否应按升序或降序排序。
我一直在了解 delphi 中的 ClientDataSet 以及它如何帮助对我的 SQL 数据库进行排序。数据在我的 TDBGrid 中显示正常,我通过更改 ClientDataset 的 IndexField 单击 header 启用了排序。有时我想让它在排序上下降,所以一直在尝试使用这里列出的 2 个 IndexNames
但是,当我将 IndexName 从 DEFAULT_ORDER 换成 CHANGEINDEX 时,我的 DBGrid 中的所有数据都消失了。我对所有这一切都很陌生,我知道这将取决于我的情况,但发生这种情况的方式有哪些,我将尝试解决这些问题。
我有 1 个 TSQLConnection 连接到 TSQLQuery,那个连接到 TDataSetProvider,那个连接到我的 ClientDataSet,它导致 TDataSource 到 TDBGrid。为什么通常很好的 ClientDataSet 在我更改名称时可能会出现问题?请记住,大多数设置都是默认设置,因为我对这些组件不太确定。谢谢,我希望你能提供一些有用的帮助,很抱歉我的情况可能很难理解。
托比
ClientDataSet 带有两个预定义索引:DEFAULT_ORDER 和 CHANGEINDEX,它们对您的任务没有实际用处,因为您无法根据需要调整它们。所以你必须创建自己的索引。可以在 this article as well as in his highly recommended book about ClientDataSets.
中找到 Cary Jensen 的全面描述我使用以下代码为客户端数据集构建索引:
Procedure BuildIndices (cds: TClientDataSet);
var
i, j: integer;
alist: tstrings;
begin
with cds do
begin
open;
logchanges:= false;
for i:= 0 to FieldCount - 1 do
if fields[i].fieldkind <> fkCalculated then
begin
j:= i * 2;
addindex ('idx' + inttostr (j), fieldlist.strings[i], [], '', '', 0);
addindex ('idx' + inttostr (j+1), fieldlist.strings[i], [ixDescending], '', '', 0);
end;
alist:= tstringlist.create;
getindexnames (alist);
alist.free;
close;
end;
end;
因此,有一个索引 'idx0' 用于对第 0 列进行升序排序,'idx1' 用于对第 0 列进行降序排序; 'idx2' 和 'idx3' 用于第 1 列等
然后,在网格的 OnTitleClick 事件中,我有以下内容
procedure Txxx.DBGrid1TitleClick(Column: TColumn);
var
n, ex: word;
begin
n:= column.Index;
try
dbgrid1.columns[prevcol].title.font.color:= clNavy
except
end;
dbgrid1.columns[n].title.font.color:= clRed;
prevcol:= n;
directions[n]:= not directions[n];
ex:= n * 2;
if directions[n] then inc (ex);
with clientdataset do
try
disablecontrols;
indexname:= 'idx' + inttostr (ex);
finally
first;
enablecontrols
end;
end;
在每种形式中,我定义了一个布尔数组 ('directions'),每个网格列一个元素。这些元素跟踪列是否应按升序或降序排序。