在 cxGrid中 增加一个不绑定任何字段的列(原创)

在cxGrid中增加一个不绑定任何字段的列,比如加入一个 CheckBox 列来指示该行是否被选择,该列无需保存到后台数据库中。

一、对 cxGrid 的 DataControler 做以下设置:

1、 将 DataModeController.GridMode 属性设置为 False (默认状态下就是False)
或通过代码设置:

cxGrid1DBTableView1.DataController.DataModeController.GridMode := False;

2、 将 DataModeController.SmartRefresh 属性设置为 True重要,这项容易被忽视,但又十分关键
或通过代码设置:

cxGrid1DBTableView1.DataController.DataModeController.SmartRefresh := True;

注意:SmartRefresh属性设为true后,如果在数据集(TTable或TQuery)中使用了 filter,那么 cxGrid 并不会自动将过滤掉的行隐藏起来,因此需要先关闭 SmartRefresh,再过滤数据,然后再将 SmartRefresh 开启。

  cxGrid1DBTableView1.DataController.DataModeController.SmartRefresh := false;
  table1.Filter := 'empno > 11';
  table1.Filtered := true;
  cxGrid1DBTableView1.DataController.DataModeController.SmartRefresh := true;

如果使用 DataControler 来过滤数据,则不需要切换 SmartRefresh 属性,cxGrid会自动同步数据的。代码如下:

  cvOldComs.DataController.Filter.BeginUpdate;
  cvOldComs.DataController.Filter.Root.Clear;
  cvOldComs.DataController.Filter.Root.AddItem(cvOldComsONCarId, foEqual, iCarId, IntToStr(iCarId));
  cvOldComs.DataController.Filter.EndUpdate;
  cvOldComs.DataController.Filter.Active := true;

3、 为 Data Controller 的 KeyFieldNames 属性指定一个主键,这个很重要,也最容易被忽视。如果没设置此属性,则加入的 Unbound 列无法进入编辑状态。
或通过代码设置:

cxGrid1DBTableView1.DataController.KeyFieldNames := 'aUniqueField';

二、向 cxView 添加一个列,不要为该列绑定任何字段,也就是说,不要为其 DataBinding.FieldName 属性指定任何值。

var
 aCol: TcxGridDBColumn;
...

 aCol := <aView>.CreateColumn;
 with aCol do
 begin
   Name := 'colUnbound';
   Caption := 'Check';
 end;

三、为该列的 DataBinding.ValueType 属性设置数据类型。

uses
 cxDataStorage;

aCol.DataBinding.ValueTypeClass := TcxBooleanValueType;

注意:当使用代码设置列的数据类型时,需要将数据类型相应的类名赋给该列的 DataBinding.ValueTypeClass 属性,这与在IDE中是不同的。

四、在该列的 Properties 属性中指定相应的编辑类型(下面以CheckBox为例)

uses
 cxCheckBox;

 aCol.PropertiesClass := TcxCheckBoxProperties;
 // 或者
 aCol.PropertiesClassName := 'TcxCheckBoxProperties';

注意:当使用代码设置该列的编辑类型时,需要引用该列的PropertiesClass或PropertiesClassName属性,并赋给相应的编辑类型类名。

posted @ 2024-08-20 08:08  汉学  阅读(43)  评论(0)    收藏  举报