获得列对象集字段(Get Column Object for DataSet Field)

2019-10-23 17:50发布

比方说,我有一组TField对象和要动态改变DBGrid的一些自己的知名度。 我也希望允许用户更改此DBGrid的列顺序,并且有一些固定的栏目。

我知道隐藏/ DBGrid的上栏显示正确的方法 ,但有一个很大,很大的设计缺陷在VCL:具有Column对象,一个可以到它的Field对象,却找不到回来的路。

我想要的是Field对象内正中下怀列属性,所以我可以输入这样的事情:

Field.Column.Visible := False;

和隐藏与分配的属性栏里面的DBGrid任何列。

我知道我可以只创建的HashSet或收集列和快速找到相应的列,但存在更直接的方式来做到这一点?

Answer 1:

如果列存储,可以使用这样的:

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);


Answer 2:

@UweRaabe已经解释了什么你问的不是一般的可能,主要是因为DGGrids知道哪些领域他们所连接而不是相反。 所以,做你想做什么,你将不得不自己编写的,如果你在你的网格使用持久列。

我不知道你是否已经意识到,但对其他读者的利益,一个TField具有可见光和索引属性。

字段的Visible属性可以通过DBGrids用来控制字段的在DBGrid的列是否是可见的,但只有当列自动创建的网格的DefaultFields设置为true。

同样,现场的指数定义其列数DBGrids,但是当DBGrid中的DefaultFields又是唯一的真。

在一个DBGrid王氏DefaultFields = True,则可以在运行时改变可视性现场的列数。

所以,虽然你不能集中控制的列在一个DBGrid的知名度和数量具有持久的列,你可以 ,如果你设置DefaultFields为真,并把它留给电网(县)创建列。



文章来源: Get Column Object for DataSet Field