如何按名称而不是索引访问TDBGrid列?
例如,现在我使用:
grdInvoiceItems.Columns[2].Visible := False;
Run Code Online (Sandbox Code Playgroud)
但是写下这样的东西要好得多:
grdInvoiceItems.Columns['UnitPrice'].Visible := False;
Run Code Online (Sandbox Code Playgroud)
与此同时,我使用for循环:
for idx := 0 to grdInvoiceItems.Columns.Count - 1 do
begin
if (
(grdInvoiceItems.Columns[idx].FieldName = 'UnitPrice') or
(grdInvoiceItems.Columns[idx].FieldName = 'Discount') or
(grdInvoiceItems.Columns[idx].FieldName = 'SecretCode')
) then
grdInvoiceItems.Columns[idx].Visible := False;
end;
Run Code Online (Sandbox Code Playgroud)
使用colum name是IMO更好的tham列索引,因为索引比名称更容易变化.
关于如何更好地封装它的任何想法?
Mar*_*ynA 12
你可以尝试这样的事情:
function ColumnByName(Grid : TDBGrid; const AName : String) : TColumn;
var
i : Integer;
begin
Result := Nil;
for i := 0 to Grid.Columns.Count - 1 do begin
if (Grid.Columns[i].Field <> Nil) and (CompareText(Grid.Columns[i].FieldName, AName) = 0) then begin
Result := Grid.Columns[i];
exit;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
当然,如果你使用的是最近足以支持Class Helpers 的Delphi版本,你可以将这个函数包装成Class Helperfor TDBGrid,就像这样
type
TGridHelper = class helper for TDBGrid
function ColumnByName(const AName : String) : TColumn;
end;
[...]
function TGridHelper.ColumnByName(const AName: String): TColumn;
var
i : Integer;
begin
Result := Nil;
for i := 0 to Columns.Count - 1 do begin
if (Columns[i].Field <> Nil) and (CompareText(Columns[i].FieldName, AName) = 0) then begin
Result := Columns[i];
exit;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
然后,你可以做到这一点
Col := DBGrid1.ColumnByName('SomeName');
Run Code Online (Sandbox Code Playgroud)
显然,你可以编写一个类似的函数来搜索列的标题,而不是相关的Field的FieldName.