获取DataSet字段的列对象

时间:2015-07-09 07:10:13

标签: database delphi tdbgrid

假设我有一组TField个对象,想要动态更改某些DBGrid中的可见性。我还想让用户在这个DBGrid中更改列顺序,并且有一些固定的列。

我知道proper way to hide/show columns on DBGrid,但VCL中存在一个很大的设计缺陷:拥有Column对象,可以移动到它的Field对象,但无法找回原因。

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

Field.Column.Visible := False;

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

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

2 个答案:

答案 0 :(得分: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; 

呼叫

SetVisibleColumn(MyGrid,MyField.Name, myField.Visible);

答案 1 :(得分:1)

@UweRaabe已经解释过,基本上你所要求的一般是不可能的 因为DGGrids知道它们连接到哪些字段但反之亦然。因此,如果你在网格中使用持久列,那么要做你想做的事情,你将不得不自己编写代码。

我不知道您是否知道,但为了其他读者的利益,TField具有Visible和Index属性。

DBGrids可以使用Field的Visible属性来控制DBGrid中字段的Column是否可见,但仅当通过将网格的DefaultFields设置为true来自动创建列时才会显示。

同样,Field's Index在DBGrids中定义其列号,但仅在DBGrid的DefaultFields为True时再次定义。

在具有DefaultFields = True的DBGrid中,您可以在运行时更改字段的列号的可见性。

因此,虽然您无法集中控制具有持久列的DBGrid中列的可见性和数量,但如果将DefaultFields设置为True并将其保留在网格中,则可以(s )创建列。