比方说,我有一组TField
对象和要动态改变DBGrid的一些自己的知名度。 我也希望允许用户更改此DBGrid的列顺序,并且有一些固定的栏目。
我知道隐藏/ DBGrid的上栏显示正确的方法 ,但有一个很大,很大的设计缺陷在VCL:具有Column对象,一个可以到它的Field对象,却找不到回来的路。
我想要的是Field对象内正中下怀列属性,所以我可以输入这样的事情:
Field.Column.Visible := False;
和隐藏与分配的属性栏里面的DBGrid任何列。
我知道我可以只创建的HashSet或收集列和快速找到相应的列,但存在更直接的方式来做到这一点?
如果列存储,可以使用这样的:
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);
@UweRaabe已经解释了什么你问的不是一般的可能,主要是因为DGGrids知道哪些领域他们所连接而不是相反。 所以,做你想做什么,你将不得不自己编写的,如果你在你的网格使用持久列。
我不知道你是否已经意识到,但对其他读者的利益,一个TField具有可见光和索引属性。
字段的Visible属性可以通过DBGrids用来控制字段的在DBGrid的列是否是可见的,但只有当列自动创建的网格的DefaultFields设置为true。
同样,现场的指数定义其列数DBGrids,但是当DBGrid中的DefaultFields又是唯一的真。
在一个DBGrid王氏DefaultFields = True,则可以在运行时改变可视性现场的列数。
所以,虽然你不能集中控制的列在一个DBGrid的知名度和数量具有持久的列,你可以 ,如果你设置DefaultFields为真,并把它留给电网(县)创建列。