如何查找网格列的顺序



我在一个表单上有一个网格,该网格连接到一个包含10个字段的数据库表。第一个字段(隐藏(是ID。第二个字段是first_Name、第三个Last_Name等。这些列的索引为1到10。现在,如果用户希望Last_Name在First_Name之前,他可以抓取该列并将其滑动过去。First_Name现在保持索引3,Last_Name位于索引2。

我需要能够读取列索引的顺序,以便将它们写入INI文件。然后,下次用户打开应用程序时,我可以将网格设置回首选状态。

我在Lazarus 2.0.6中使用TRxDBGrid来实现这一点。我已经尝试了它的几个属性,但没有一个显示网格列顺序。

我通常使用Delphi而不是Lazarus,并且一直试图将RXDbGrid包安装到Lazarus 2.0.6中,以检查我对此的建议答案,但到目前为止没有任何运气。然而

TRxColumn从DBGrids源文件中的TColumn下降。

TColumn有一个公共属性Index,它是一个整数,是GridColumns集合中列的索引。

因为我无法让RXDBGrid安装atm,下面的例子使用了一个普通的TDBGrid,但应该可以很好地处理明显的细节变化。

该示例有3个字段,ID integer、Name String[20]和Value integer。

为了简单起见,列顺序被保存到TMemo,而不是保存和加载IniFile,为了测试LoadColumnInfo,您需要更改备忘录中的列顺序。

如您所见,要重新加载网格列顺序,最简单的方法是保存列标题;按左->右顺序排列,并在重新加载保存的信息时使用函数ColumnByName查找正确的列。

uses
Classes, SysUtils, memds, db, Forms, Controls, Graphics, Dialogs, DBGrids,
StdCtrls;
type
TForm1 = class(TForm)
btnSaveColumns: TButton;
btnLoadColumns: TButton;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
MemDataset1: TMemDataset;
Memo1: TMemo;
procedure btnLoadColumnsClick(Sender: TObject);
procedure btnSaveColumnsClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
function ColumnByName(const AName: String): TColumn;
procedure LoadColumnInfo;
procedure SaveColumnInfo;
public
end;
[...]
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
MemDataSet1.Open;
for i := 0 to 5 do
MemDataSet1.InsertRecord([i, 'Name' + IntToStr(i), i]);
end;
procedure TForm1.btnSaveColumnsClick(Sender: TObject);
begin
SaveColumnInfo;
end;
procedure TForm1.btnLoadColumnsClick(Sender: TObject);
begin
LoadColumnInfo;
end;
procedure TForm1.SaveColumnInfo;
var
i : Integer;
S : String;
begin
Memo1.Lines.Clear;
for i := 0 to DBGrid1.Columns.Count - 1 do begin
S := DBGrid1.Columns[i].Title.Caption;
Memo1.Lines.Add(S);
end;
end;
function TForm1.ColumnByName(const AName : String) : TColumn;
var
i : integer;
begin
for i := 0 to DBGrid1.Columns.Count - 1 do begin
Result := DBGrid1.Columns[i];
if CompareText(AName, Result.Title.Caption) = 0 then
exit;
end;
Result := Nil;
end;
procedure TForm1.LoadColumnInfo;
var
i : Integer;
Index : Integer;
Column : TColumn;
S : String;
begin
for i := 0 to Memo1.Lines.Count - 1 do begin
S := Memo1.Lines[i];
Column := ColumnByName(S);
Assert(Column <> Nil);
Column.Index := i;
end;
end;
end.

最新更新