Delphi:避免在 TDBgrid 中编辑列

问题描述 投票:0回答:2

我知道使用列的只读属性,我可以避免编辑其字段值。但这并不能阻止就地编辑器展现自己。 我需要一种方法来使该列不仅受到保护而且“不可触及”。 请问有什么办法吗?

delphi editing tdbgrid in-place-editor
2个回答
2
投票

如果我正确理解您想要什么,您可以通过创建自定义 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 or 中,如果您的 Delphi 版本足够新,请实现

CanEditShow
class helper


0
投票

在 TDBGrid.ColEnter 事件上,您可以执行以下操作:

procedure TForm1.DBGridColEnter(Sender: TObject);  begin  if(/* YOUR CONDITION TO REMOVE EDITING */) Then DBGrid.Options := DBGrid.Options - [dgEditing] else DBGrid.Options := DBGrid.Options + [dgEditing];
结束;

© www.soinside.com 2019 - 2024. All rights reserved.