我知道使用列的readonly属性,可以避免编辑其字段值。但这并不会阻止就地编辑器显示自身。
我需要一种方法使该列不仅受保护而且“不可触碰”。
请问有办法吗?

最佳答案

如果我正确理解了您想要的内容,则可以通过创建自定义TDBGrid后代并覆盖来进行简单操作
CanEditShow方法,因为这确定是否可以创建网格的InplaceEditor

type
  TMyDBGrid = class(TDBGrid)
  private
    FROColumn: Integer;
  protected
    function CanEditShow : Boolean; override;
  public
    property ROColumn : Integer read FROColumn write FROColumn;
  end;

function TMyDBGrid.CanEditShow: Boolean;
begin
  Result := Inherited CanEditShow;
  Result := Result and (Col <> ROColumn);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyDBGrid := TMyDBGrid.Create(Self);
  MyDBGrid.ROColumn := 1;
  MyDBGrid.DataSource := DataSource1;
  MyDBGrid.Parent := Self;
[...]


这个极简的示例仅将一个网格列按数字定义为
不允许InplaceEditor的地方;显然,您可以使用任何机制
您想标识CanEditShow返回False的列。

请注意,如果您关闭Indicator列(即,将Options.dgIndicator设置为False),则上面的代码无法说明网格的列编号会发生变化的事实;

显然,通过使用如下所示的可分配事件,您可以更加灵活地自定义InplaceEditor允许哪些列

type

  TAllowGridEditEvent = procedure(Sender : TObject; var AllowEdit : Boolean) of object;

  TMyDBGrid = class(TDBGrid)
  private
    FOnAllowEdit: TAllowGridEditEvent;
  protected
    function CanEditShow : Boolean; override;
    procedure DoAllowEdit(var AllowEdit : Boolean);
  public
    property OnAllowEdit : TAllowGridEditEvent read FOnAllowEdit write FOnAllowEdit;
  end;

function TMyDBGrid.CanEditShow: Boolean;
begin
  Result := Inherited CanEditShow;
  if Result then
    DoAllowEdit(Result);
end;

procedure TMyDBGrid.DoAllowEdit(var AllowEdit: Boolean);
begin
  if Assigned(FOnAllowEdit) then
    FOnAllowEdit(Self, AllowEdit);
end;

procedure TForm1.AllowEdit(Sender: TObject; var AllowEdit: Boolean);
var
  Grid : TMyDBGrid;
begin
  Grid := Sender as TMyDBGrid;
  AllowEdit := Grid.Col <> 1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyDBGrid := TMyDBGrid.Create(Self);
  MyDBGrid.ROColumn := 1;
  MyDBGrid.DataSource := DataSource1;
  MyDBGrid.Parent := Self;
  MyDBGrid.OnAllowEdit := AllowEdit;
  [...]


如果您不喜欢用代码创建网格,可以将其放在自定义程序包中并安装
在IDE中,或者,如果您的Delphi版本足够新,请实施
CanEditShow中的class helper

关于delphi - Delphi:避免在TDBgrid中编辑列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37992122/

10-10 13:36
查看更多