我想只有一些细胞在TDBGrid中进行编辑。 在给定的列,一些但不是所有的细胞都可以编辑,所以我不能只是设置Column.ReadOnly整个列,然后离开它的方式。
什么事件是最好的使用,因此进入小区的时候,我可以得到控制。 我可能会使用TDbGrid.ColumnEnter赶上水平运动和TDataSet.AfterScroll在网格垂直运动。 或者,我也许可以用TDBGrid.DrawColumnCell(这我已在使用更改某些单元格的颜色...)
而且我也有麻烦找出最好的方式改变只读细胞的状态。 我可以设置底层TTable.Field.ReadOnly,或TDbGrid.Columns []。只读。
我可以与所有上述的实验,但后来我根据我的测试,以确定网格是如何实现的,并可能忽略了一些情况。 我更愿意知道,如果VCL提供了一种方法来管理这方面的需求,如果有警告,等等。
相关阅读: 只读TDBGrid中/ TwwDBGrid细胞在Delphi? ,但不处理通过键盘滚动。
您可以覆盖CanEditModify功能,并添加您希望的条件。 这可以通过创建仅由interposerclass添加新的事件或新compoent来完成。
unit Unit6;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, Grids, DBGrids;
type
TDBGrid=Class(DBGrids.TDBgrid)
function CanEditModify: Boolean; override;
Property Col; // make property col visible
End;
TForm6 = class(TForm)
DBGrid1: TDBGrid;
ADOConnection1: TADOConnection;
ADODataSet1: TADODataSet;
DataSource1: TDataSource;
ADODataSet1Componame: TStringField;
ADODataSet1TrackTitle: TStringField;
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form6: TForm6;
implementation
{$R *.dfm}
{ TDBGrid }
function TDBGrid.CanEditModify: Boolean;
var
f:TField;
c:Integer;
begin
Result := inherited CanEditModify;
c := Col;
if dgIndicator in Options then dec(c);
F := Columns[c].Field;
if Assigned(F) then
begin // here just an example condition
if (f.FieldName='TrackTitle') then
if Pos('aa',F.AsString)>0 then Result := False;
// you also can access the dataset via
// if f.DataSet.FieldByName('xy').SomeCondition then ....
end;
end;
end.
该DBGrid中决定是否显示根据大量的输入文本编辑框:
- 无论DBGrid的本身是只读的。
- 无论数据集是只读的
- 该列是否是只读
- 该字段是否为只读
- 无论数据集可以被放入编辑模式
如果你想在一个DBGrid列编辑,和其他细胞在同一列中的某些细胞不可编辑,你将不得不自己做。 该DBGrid中看起来数据集的大部分线索,与电网范围内的柱状覆盖。
我不记得,如果数据集字段CanModify可以被配置为返回不同的真实或根据个别行的数据错误。 如果是这样,这可能是你最好的选择。 该DBGrid的将履行任何领域CanModify返回。
如果CanModify不是每行上下文,你可以把你的逻辑来决定哪些细胞应该在CanEditModify编辑。 创建一个新的网格类从TDBGrid中(或TCustomDBGrid)继承和覆盖CanEditModify虚拟方法。 你或许应该做您的定制逻辑,然后再调用继承的方法,如果你的逻辑并不适用。 您可能需要重写一些其他方法来微调外观,如CanEditShow。