在已排序的TDBGrid中查找下一条记录

时间:2016-07-29 06:06:36

标签: sorting delphi dbgrid

我有连接FDQuery的女巫TDBGrid。当单击列标题时,我使用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';

我得到上述结果。在第一个代码块中,我为所有字段创建索引,以便它们可以在seconde代码块中调用(事件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;

端;

2 个答案:

答案 0 :(得分:2)

我认为您可能遇到与此问题相同的问题:

Indexes don't work in FDQuery

您需要做的是添加

AQuery1.IndexName := AIndex.Name;

作为except阻止之前的最后一行。

不过,顺便说一下,排序与网格无关。一旦索引正确 激活后,网格将以正确的顺序显示,并且对AQuery.Next的调用应该按预期运行。

答案 1 :(得分:0)

最终编辑

我发现了问题。问题在于关闭和重新打开数据集。因此,在Refresh中丢失了sort(index)。我解决了在关闭数据集之前记住索引名称的问题,并在我打开数据集时将其放回。