假设我有一组TField
个对象,想要动态更改某些DBGrid中的可见性。我还想让用户在这个DBGrid中更改列顺序,并且有一些固定的列。
我知道proper way to hide/show columns on DBGrid,但VCL中存在一个很大的设计缺陷:拥有Column对象,可以移动到它的Field对象,但无法找回原因。
我想要的只是Field对象中的Column属性,所以我可以输入这样的内容:
Field.Column.Visible := False;
并使用指定的Columns属性隐藏DBGrid中的任何列。
我知道我可以创建带有列的HashSet或Collection并快速找到相应的列,但是还有更直接的方法吗?
答案 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)
我不知道您是否知道,但为了其他读者的利益,TField具有Visible和Index属性。
DBGrids可以使用Field的Visible属性来控制DBGrid中字段的Column是否可见,但仅当通过将网格的DefaultFields设置为true来自动创建列时才会显示。
同样,Field's Index在DBGrids中定义其列号,但仅在DBGrid的DefaultFields为True时再次定义。
在具有DefaultFields = True的DBGrid中,您可以在运行时更改字段的列号的可见性。
因此,虽然您无法集中控制具有持久列的DBGrid中列的可见性和数量,但如果将DefaultFields设置为True并将其保留在网格中,则可以(s )创建列。