【问题标题】:Delphi dbGrid - Column NamesDelphi dbGrid - 列名
【发布时间】:2021-01-21 18:54:14
【问题描述】:

我经常用索引号来引用dbgrid中某个字段的值,例如:

dbgrid1.Fields[8].AsString:= 'SomeValue'; //索引 8 引用名为“付款”的字段

这可以正常工作,直到我更改 dbgrid 在字段编辑器中列出的字段,此时我必须搜索所有上述用法并更改索引号。

如果我可以使用以下内容来引用该领域,那就更简单了,出现问题的机会也更少:

dbgrid1.Field('Payment').AsString:= 'SomeValue';

有没有办法做到这一点?

【问题讨论】:

  • 为什么使用 DBGrid 列中的值而不是基础表中的值?这是正确的方法,您可以直接按名称访问该字段。 DBGrid 只是它所连接的数据集中的数据视图,而显示该数据是它的唯一目的。
  • 好点!猜猜我被哄骗认为这是访问列的方式,但你是对的,我可以使用底层的 FieldByName('Payment') 来访问该字段。谢谢你。

标签: delphi firedac dbgrid


【解决方案1】:

您可以使用这样的简单函数按字段名访问 TDBGrid 列:

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;

那么,你可以这样做:

ColumnByName(dbgrid1, 'Payment').AsString:= 'SomeValue';

如果您使用的是 FireDAC,则您的 Delphi 版本足够新以支持类助手,因此您可以改用类助手:

type
  TGridHelper = class helper for TDBGrid
    function ColumnByName(const AName : String) : TColumn;
  end;

[...]

{ TGridHelper }

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;

然后

dbgrid1.ColumnByName('Payment').AsString := 'SomeValue';

【讨论】:

  • 感谢您的提示。之前的评论让我想到了为什么我会这样做,并想到我认为使用 FieldByName('Payment').AsString 方式可以完成相同的工作并避免可能的错误。请注意,您获取列名的方法看起来不错,所以我可以尝试一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
相关资源
最近更新 更多