Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 在已排序的TDBGrid中查找下一条记录_Sorting_Delphi_Dbgrid - Fatal编程技术网

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

Sorting 在已排序的TDBGrid中查找下一条记录,sorting,delphi,dbgrid,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

我在连接到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;
我知道我将使用以下内容移动到过滤网格中的下一条记录:

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';
我得到了上面描述的结果。在第一个代码块中,我为所有字段创建索引,以便在第二个代码块中调用它们(event OnColumnSort)

编辑2 我更改了一些代码。我将索引创建放在事件OnColumnSort中,这样就不会在开始时为每个字段创建索引。查询。下一步仍然不起作用

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;
作为
块之前的最后一行,但
块除外

顺便说一句,排序当然与网格无关。一旦索引正确设置
激活后,网格将以正确的顺序显示,并调用
AQuery。下一步
应按预期运行。

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

您需要做的是添加行

AQuery1.IndexName := AIndex.Name;
作为
块之前的最后一行,但
块除外

顺便说一句,排序当然与网格无关。一旦索引正确设置
激活后,网格将以正确的顺序显示,并调用
AQuery。下一步
应按预期进行。

最终编辑


我发现了问题。问题在于关闭和重新打开数据集。所以排序(索引)在刷新中丢失。我解决了在关闭数据集之前记住索引名的问题,并在打开数据集时将其放回原处。

FINAL EDIT


我发现了问题。问题在于关闭和重新打开数据集。所以排序(索引)在刷新中丢失。我解决了在关闭数据集之前记住索引名的问题,并在打开数据集时将其放回原处。

我在event OnColumnSort中建议这样做。我得到排序的网格,但查询。下一个行为仍然是一样的。查看我的编辑。我在event OnColumnSort中建议了。我得到排序的网格,但查询。下一个行为仍然是一样的。看我的编辑。