使用内存表对网格进行排序

5

我想对一个网格进行排序。我创建了一个内存表,并将其链接到网格作为数据源。我从nxQuery对象向内存表插入数据。为了进行排序,我还必须在内存表中添加索引。

这是在创建事件中添加索引和插入数据的部分。

nxMemTable1.IndexDefs.Clear;
nxMemTable1.FieldDefs.Clear;

nxMemTable1.FieldDefs.Add('packpatientid', ftInteger, 0, False);
nxMemTable1.FieldDefs.Add('firstname', ftString, 10, False);
nxMemTable1.FieldDefs.Add('lastname', ftString, 10, False);
while not nxQuery1.EOF do
begin
  nxMemTable1.Append;
  nxMemTable1.FieldByName('packpatientid').AsInteger :=   nxQuery1packpatientid.AsInteger;
  nxMemTable1.FieldByName('firstname').AsString := nxQuery1firstname.AsString;
  nxMemTable1.FieldByName('lastname').AsString := nxQuery1lastname.AsString;
  nxMemTable1.Post;
end;

以下是我尝试对内存表进行排序的代码:

procedure TForm1.Button2Click(Sender: TObject); begin nxMemTable1.IndexFieldNames := 'firstname'; end;

但是这个方法并没有起作用。当我点击按钮时,它会显示“字段 'firstname' 没有索引”。


也许这个线程可以帮到你:http://stackoverflow.com/a/2350500/5470883 - Alexander Baltasar
表面上看,对nxMemTable1.IndexFieldNames的赋值应该是有效的。如果不行,那么我认为你需要问问nxMemTable1的作者,因为这看起来像是一个bug。创建一个在代码中生成数据而不是从另一个数据集复制数据的示例。 - MartynA
1个回答

4

这适用于标准的TClientDataSet

我创建了一个新的VCL Forms项目,在表单上放置了一个TClientDataSet,并将其命名为CDS以便在代码中更加简单。然后我添加了一个TDataSource,将CDS分配给它的DataSet属性,添加了一个TDBGrid,并将DataSet1分配给它的DataSource属性。接着我创建了两个事件处理程序,一个是Form1.OnCreate事件,另一个是DBGrid1.OnTitleClick事件。

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
var
  sField: string;
begin
  sField := Column.FieldName;
  if sField <> CDS.IndexFieldNames then
    CDS.IndexFieldNames := sField;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CDS.FieldDefs.Add('LastName', ftString, 30);
  CDS.FieldDefs.Add('FirstName', ftString, 30);
  CDS.FieldDefs.Add('ID', ftInteger);
  CDS.CreateDataSet;
  CDS.AppendRecord(['Smith', 'John', 3]);
  CDS.AppendRecord(['Doe', 'Jane', 1]);
  CDS.AppendRecord(['Adams', 'Quincy', 2]);
  CDS.IndexFieldNames := 'LastName';
end;

运行应用程序并单击任何列标题,即可立即按该列对DBGrid进行排序(如果尚未按该列排序)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接