我只想在TDBGrid中编辑一些单元格。 在给定的列中,一些但不是所有单元格都是可编辑的,因此我不能只为整列设置Column.ReadOnly,然后保持这种方式。

最好使用哪些事件,以便在输入单元格时获得控制权。 我可能会使用TDbGrid.ColumnEnter来捕获水平移动和TDataSet.AfterScroll以在网格中进行垂直移动。 或者我也许可以使用TDBGrid.DrawColumnCell(我已经用它来改变某些单元格的颜色......)

而且我也无法找出改变单元的只读状态的最佳方法。 我可以设置底层的TTable.Field.ReadOnly或TDbGrid.Columns [] .ReadOnly。

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

相关: Delphi中的ReadOnly TDBGrid / TwwDBGrid单元格? ,但不通过键盘处理滚动。

===============>>#1 票数:3 已采纳

您可以覆盖CanEditModify函数并添加您希望的条件。 这可以通过添加新事件或仅通过interposerclass创建新组件来完成。

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.

===============>>#2 票数:1

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

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

如果要使DBGrid列中的某些单元格可编辑,并且同一列中的其他单元格不可编辑,则您必须自己执行此操作。 DBGrid通过网格范围和列式覆盖查找数据集的大多数提示。

我不记得数据集字段CanModify是否可以配置为根据单个行数据返回不同的true或false。 如果是这样,这可能是您最好的选择。 DBGrid将尊重CanModify返回的任何字段。

如果CanModify不是每行上下文,您可以使用逻辑来决定CanEditModify中哪些单元格可以编辑。 创建一个继承自TDBGrid(或TCustomDBGrid)的新网格类,并覆盖CanEditModify虚拟方法。 您应该首先执行自定义逻辑,然后在逻辑不适用时调用继承的方法。 您可能需要覆盖一些其他方法来微调外观,例如CanEditShow。

  ask by RobertFrank translate from so

未解决问题?本站智能推荐:

1回复

当dgRowSelect设置为True时,检测在TDBGrid中单击了哪个单元格?

在delphi 2010中,有什么方法可以将dgRowSelect设置为True时检测单击了哪个单元格? 通常,我将使用OnCellClick(Column: TColumn)事件处理程序,但这无法正常工作。 在dgRowSelect = False此过程将传递被单击的列,但是在dgRo
4回复

如何在Delphi TDBGrid中修改单元格值

我必须在VCL TDBGrid(Delphi XE2)中显示一些修改后的'masked'值,即:将'password'更改为'xxxxxxxx'或将大写'pass'更改为'PASS'或其他。 因为我的字段是动态创建的(但名称是编码所以我知道如何以及何时屏蔽它们,即:xxxx_PASSW用于密码
1回复

模拟鼠标单击TDBGrid中的单元格

如何模拟鼠标单击TDBGrid中的某些单元格?
2回复

Delphi中的ReadOnly TDBGrid / TwwDBGrid单元格?

是否可以在Delphi中将TDBGrid(或TwwDBGrid)单元设置为ReadOnly? 目前,我正在摆弄字面上的单元格变灰并在编辑后将其清除的方法,但这并不是很令人满意。 干杯,杰米
1回复

设置TDBGrid可见行

我想在给定VisibleRows参数的情况下调整TDBGrid高度。 网格可能有也可能没有标题。 假设我从数据库中选择了100条记录,但我想调整网格高度以显示前10行(使它们可见)。 数据集仍将保留100条记录。 即 我知道如何获得可见的行: 但是,有没有办法设置
1回复

停止自动编辑在TDBGrid中工作

D5,ZEOS 6.6,SQLite。 我有srcAccount.AutoEdit = False; 我在TDBGrid选项中将所有编辑功能设置为False。 仅将指标,研磨线和标题设置为true的选项。 我有一个带有几个TDBEdits和一个TDBGrid的表单,其中显示了
1回复

如何在TDBGrid排序中设置字符顺序?

我正在使用连接到TDataSource的TDBGrid。 此TDataSource使用TADOQuery作为其数据集。 TADOQuery连接到Oracle10g数据库并保存以下查询: ST.desc是一个字符串,通常包含以下数据: 一切工作正常,除了在SQLTools中运行
1回复

限制TDBGrid中的inplace编辑器的最大文本长度

如何在TDBGrid限制inplace编辑器的最大文本长度? (德尔福柏林) 数据类型是Float。
1回复

Delphi / C ++ Builder-在TDBGrid中设置活动/选定的行颜色

我想在TDBGrid控件中设置活动/选定行的背景色。 使用OnDrawColumnCell事件: 1)如果DBGrid具有dgMultiSelect选项,则以下代码将起作用,如果没有,则什么也不会发生: 2)如果DBGrid具有dgRowSelect选项,则下面的代码将起作用
1回复

检索TDBGrid中特定列的值

我的应用程序中有一个名为Grid的TDBGRID,其中包含3列: 我的网格是多选的。 当用户单击按钮时,如何获取所选行的EMP_ID(我想将它们传递给存储过程)。