设置一些细胞在TDBGrid中为可编辑(Set some cells in TDbGrid to e

2019-08-31 07:43发布

我想只有一些细胞在TDBGrid中进行编辑。 在给定的列,一些但不是所有的细胞都可以编辑,所以我不能只是设置Column.ReadOnly整个列,然后离开它的方式。

什么事件是最好的使用,因此进入小区的时候,我可以得到控制。 我可能会使用TDbGrid.ColumnEnter赶上水平运动和TDataSet.AfterScroll在网格垂直运动。 或者,我也许可以用TDBGrid.DrawColumnCell(这我已在使用更改某些单元格的颜色...)

而且我也有麻烦找出最好的方式改变只读细胞的状态。 我可以设置底层TTable.Field.ReadOnly,或TDbGrid.Columns []。只读。

我可以与所有上述的实验,但后来我根据我的测试,以确定网格是如何实现的,并可能忽略了一些情况。 我更愿意知道,如果VCL提供了一种方法来管理这方面的需求,如果有警告,等等。

相关阅读: 只读TDBGrid中/ TwwDBGrid细胞在Delphi? ,但不处理通过键盘滚动。

Answer 1:

您可以覆盖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.


Answer 2:

该DBGrid中决定是否显示根据大量的输入文本编辑框:

  1. 无论DBGrid的本身是只读的。
  2. 无论数据集是只读的
  3. 该列是否是只读
  4. 该字段是否为只读
  5. 无论数据集可以被放入编辑模式

如果你想在一个DBGrid列编辑,和其他细胞在同一列中的某些细胞不可编辑,你将不得不自己做。 该DBGrid中看起来数据集的大部分线索,与电网范围内的柱状覆盖。

我不记得,如果数据集字段CanModify可以被配置为返回不同的真实或根据个别行的数据错误。 如果是这样,这可能是你最好的选择。 该DBGrid的将履行任何领域CanModify返回。

如果CanModify不是每行上下文,你可以把你的逻辑来决定哪些细胞应该在CanEditModify编辑。 创建一个新的网格类从TDBGrid中(或TCustomDBGrid)继承和覆盖CanEditModify虚拟方法。 你或许应该做您的定制逻辑,然后再调用继承的方法,如果你的逻辑并不适用。 您可能需要重写一些其他方法来微调外观,如CanEditShow。



文章来源: Set some cells in TDbGrid to editable