Delphi : 避免编辑 TDBgrid 中的列
Delphi : Avoid editing a column in TDBgrid
我知道使用列的只读 属性,我可以避免编辑它的字段值。但这并不能阻止就地编辑器展现自己。
我需要一种方法使该列不仅受保护而且 "untouchable"。
请问有什么办法吗?
如果我理解你想要的是正确的,你可以很简单地做到这一点,通过创建一个自定义的 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
returns 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
.
我知道使用列的只读 属性,我可以避免编辑它的字段值。但这并不能阻止就地编辑器展现自己。 我需要一种方法使该列不仅受保护而且 "untouchable"。 请问有什么办法吗?
如果我理解你想要的是正确的,你可以很简单地做到这一点,通过创建一个自定义的 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
returns 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
.