获取DataSet字段的列对象

Dan*_*ela 1 database delphi tdbgrid

比方说,我有一组TField对象,想要动态地改变它们在某些DBGrid中的可见性.我还想允许用户更改此DBGrid中的列顺序,并具有一些固定列.

我知道在DBGrid上隐藏/显示列的正确方法,但是在VCL中存在一个很大的设计缺陷:拥有Column对象,可以移动到它的Field对象,但无法找回原因.

我想要的只是Field对象中的一种Column属性,所以我可以这样输入:

Field.Column.Visible := False;
Run Code Online (Sandbox Code Playgroud)

并使用指定的Columns属性隐藏DBGrid中的任何列.

我知道我可以用列创建HashSet或Collection并快速找到相应的列,但是有更直接的方法吗?

Val*_*nov 5

如果存储了列,可以使用以下内容:

function FindFieldColumn(Grid : TDBGrid; const FieldName: String):  TColumn;
var
  i: Integer;
begin
  Result := nil;
  for i := 0 to Grid.Columns.Count - 1 do
    if AnsiCompareText(Grid.Columns[i].FieldName, FieldName) = 0 then
      begin
         Result := Grid.Columns[i];
         Break;
      end;
end;

procedure SetVisibleColumn(Grid : TDBGrid; AFieldName : string; AVisible : boolean);
var
  Column : TColumn;
begin
  Column := FindFieldColumn(Grid,AFieldName);
  if Assigned(Column) then
     Column.Visible := AVisible;
end; 
Run Code Online (Sandbox Code Playgroud)

呼叫

SetVisibleColumn(MyGrid,MyField.Name, myField.Visible);
Run Code Online (Sandbox Code Playgroud)

  • @Danatela 在第一个决定的答案中,您使用 OnDrawColumnCell。OnDrawColumnCell 将执行多少次?实际上,只有在创建 DBGrid 并且用户更改字段的可见性时才应该执行上面的代码。 (2认同)