1

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

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

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

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

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

4

2 回答 2

4

您可以覆盖 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.
于 2013-04-16T17:28:16.827 回答
1

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

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

如果要使 DBGrid 列中的某些单元格可编辑,而同一列中的其他单元格不可编辑,则必须自己进行。DBGrid 通过网格范围和列覆盖来查找数据集的大部分线索。

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

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

于 2013-04-16T17:28:58.767 回答