在 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属性,并赋给相应的编辑类型类名。

浙公网安备 33010602011771号