在排序的 TDBGrid 中查找下一条记录
Find next record in sorted TDBGrid
我在 上有 TDBGrid 我已经连接了 FDQuery。单击列标题时,我使用 FDQuery 索引即时对记录进行排序。
procedure TMainDM.CreateIndexes(AQuery: TFDQuery);
var
I: Integer;
begin
try
AQuery.Indexes.Clear;
for I := 0 to AQuery.FieldCount - 1 do
begin
with AQuery.Indexes.Add do
begin
Name := AQuery.Fields[i].FieldName + '_index_asc';
Fields:= AQuery.Fields[i].FieldName;
Options:= [soNoCase];
Active:= True;
end;
with AQuery.Indexes.Add do
begin
Name := AQuery.Fields[i].FieldName + '_index_desc';
DescFields:= AQuery.Fields[i].FieldName;
Fields:= AQuery.Fields[i].FieldName;
Active:= True;
end;
end;
except
on E: Exception do
ErrorLogger('ERROR: TMainDM.CreateIndexes -> ' + E.Message);
end;
end;
如何从当前选定的记录中获取下一条记录?我知道我移动到未排序网格的下一条记录:
DBGrid.DataSource.Dataset.Next;
我知道我移动到过滤网格中的下一条记录:
DBGrid.DataSource.Dataset.FindNext;
如何在排序列表中找到下一条记录?当我调用 Next 或 FindNext 时,我得到未排序网格的下一条记录。
编辑 1
我将 FDQuery 属性 IndexName 设置为在事件 OnColumnSort 中选择的索引。
if Direction then
TFDQuery(TaskDataSource.DataSet).IndexName:= Column.FieldName + '_index_asc'
else
TFDQuery(TaskDataSource.DataSet).IndexName:= Column.FieldName + '_index_desc';
我得到了上述结果。在第一个代码块中,我为所有字段创建索引,以便它们可以在第二个代码块中调用(事件 OnColumnSort)
编辑 2
我更改了一些代码。我将索引创建放在事件 OnColumnSort 中,因此开始时每个字段都没有索引。 Query.Next 还是不行。
procedure TMain.TaskGridColumnSort(Column: TUniDBGridColumn;
Direction: Boolean);
begin
try
TFDQuery(TaskDataSource.DataSet).Indexes.Clear;
if Direction then
begin
with TFDQuery(TaskDataSource.DataSet).Indexes.Add do
begin
Name := Column.FieldName + '_index_asc';
Fields:= Column.FieldName;
Options:= [soNoCase];
Active:= True;
end;
TFDQuery(TaskDataSource.DataSet).IndexName:= Column.FieldName + '_index_asc';
end
else
begin
with TFDQuery(TaskDataSource.DataSet).Indexes.Add do
begin
Name := Column.FieldName + '_index_desc';
DescFields:= Column.FieldName;
Fields:= Column.FieldName;
//Options:= [soDescending, soNoCase];
Active:= True;
end;
TFDQuery(TaskDataSource.DataSet).IndexName:= Column.FieldName + '_index_desc';
end;
except
on E: Exception do
MainDM.ErrorLogger('ERROR: TMain.TaskGridColumnSort -> ' + E.Message);
end;
结束;
我想你可能遇到了和这个问题一样的问题:
您需要做的是添加行
AQuery1.IndexName := AIndex.Name;
作为 except
块之前的最后一行。
顺便说一句,排序当然与网格无关。一旦索引正确
激活时,网格将以正确的顺序显示,并且对 AQuery.Next
的调用应该按预期运行。
最终编辑
我发现了问题。问题在于关闭和重新打开数据集。所以sort(index)在Refresh中丢失了。我解决了在关闭数据集之前记住索引名称并在打开数据集时将其放回原处的问题。
我在 上有 TDBGrid 我已经连接了 FDQuery。单击列标题时,我使用 FDQuery 索引即时对记录进行排序。
procedure TMainDM.CreateIndexes(AQuery: TFDQuery);
var
I: Integer;
begin
try
AQuery.Indexes.Clear;
for I := 0 to AQuery.FieldCount - 1 do
begin
with AQuery.Indexes.Add do
begin
Name := AQuery.Fields[i].FieldName + '_index_asc';
Fields:= AQuery.Fields[i].FieldName;
Options:= [soNoCase];
Active:= True;
end;
with AQuery.Indexes.Add do
begin
Name := AQuery.Fields[i].FieldName + '_index_desc';
DescFields:= AQuery.Fields[i].FieldName;
Fields:= AQuery.Fields[i].FieldName;
Active:= True;
end;
end;
except
on E: Exception do
ErrorLogger('ERROR: TMainDM.CreateIndexes -> ' + E.Message);
end;
end;
如何从当前选定的记录中获取下一条记录?我知道我移动到未排序网格的下一条记录:
DBGrid.DataSource.Dataset.Next;
我知道我移动到过滤网格中的下一条记录:
DBGrid.DataSource.Dataset.FindNext;
如何在排序列表中找到下一条记录?当我调用 Next 或 FindNext 时,我得到未排序网格的下一条记录。
编辑 1
我将 FDQuery 属性 IndexName 设置为在事件 OnColumnSort 中选择的索引。
if Direction then
TFDQuery(TaskDataSource.DataSet).IndexName:= Column.FieldName + '_index_asc'
else
TFDQuery(TaskDataSource.DataSet).IndexName:= Column.FieldName + '_index_desc';
我得到了上述结果。在第一个代码块中,我为所有字段创建索引,以便它们可以在第二个代码块中调用(事件 OnColumnSort)
编辑 2
我更改了一些代码。我将索引创建放在事件 OnColumnSort 中,因此开始时每个字段都没有索引。 Query.Next 还是不行。
procedure TMain.TaskGridColumnSort(Column: TUniDBGridColumn;
Direction: Boolean);
begin
try
TFDQuery(TaskDataSource.DataSet).Indexes.Clear;
if Direction then
begin
with TFDQuery(TaskDataSource.DataSet).Indexes.Add do
begin
Name := Column.FieldName + '_index_asc';
Fields:= Column.FieldName;
Options:= [soNoCase];
Active:= True;
end;
TFDQuery(TaskDataSource.DataSet).IndexName:= Column.FieldName + '_index_asc';
end
else
begin
with TFDQuery(TaskDataSource.DataSet).Indexes.Add do
begin
Name := Column.FieldName + '_index_desc';
DescFields:= Column.FieldName;
Fields:= Column.FieldName;
//Options:= [soDescending, soNoCase];
Active:= True;
end;
TFDQuery(TaskDataSource.DataSet).IndexName:= Column.FieldName + '_index_desc';
end;
except
on E: Exception do
MainDM.ErrorLogger('ERROR: TMain.TaskGridColumnSort -> ' + E.Message);
end;
结束;
我想你可能遇到了和这个问题一样的问题:
您需要做的是添加行
AQuery1.IndexName := AIndex.Name;
作为 except
块之前的最后一行。
顺便说一句,排序当然与网格无关。一旦索引正确
激活时,网格将以正确的顺序显示,并且对 AQuery.Next
的调用应该按预期运行。
最终编辑
我发现了问题。问题在于关闭和重新打开数据集。所以sort(index)在Refresh中丢失了。我解决了在关闭数据集之前记住索引名称并在打开数据集时将其放回原处的问题。