方法一
1,添加单元文件cxCheckBox,窗体添加clientDataset,datasource,adoquery,cxgrid
2,添加类声明
type
TCheckBoxClickEvent=procedure(Sender: TObject) of object;
type
TCheckBoxClick = class(TObject)
private
FOnCheckBoxClick:TCheckBoxClickEvent; //定义一个内部事件,private里的只能在类内部调用
public
property View_UpCheckBoxColumnPropertiesChange:TCheckBoxClickEvent read FOnCheckBoxClick write FOnCheckBoxClick; //定义一个外部的事件
end;
在public中,添加方法
procedure View_UpCheckBoxColumnPropertiesChange(Sender: TObject);
3方法实现,根据checkbox状态设置语句
procedure Tfrm_w_checker.View_UpCheckBoxColumnPropertiesChange(Sender: TObject);
begin
////////////////////////////////////////////////////
if dw_checker2.Focused = true then
if (Sender as TcxCheckBox).checked then
begin
//dw_add_job.Controller.FocusedColumn.Tag := 1;
dw_checker2.ViewData.Rows[dw_checker2.Controller.FocusedRowIndex].Values[0]:= true;
checker := '1';
doctor := trim(dw_checker2.ViewData.Rows[dw_checker2.Controller.FocusedRowIndex].Values[4]);
end
else
begin
// dw_add_job.Controller.FocusedColumn.Tag := 0;
dw_checker2.ViewData.Rows[dw_checker2.Controller.FocusedRowIndex].Values[0]:= false;
checker := '0';
doctor := '';
end;
end;
4.formshow中生成cxgrid如下
str_sql := 'SELECT tblxt_role.role_name,tblxt_user.user_name,tblzy_adtward.ward_name,tblxt_user.user_code,';
str_sql := str_sql + 'tblxt_user.ward_code,tblxt_user.role_code ';
str_sql := str_sql + ' FROM tblxt_role,tblxt_user,tblzy_adtward ';
str_sql := str_sql + ' WHERE ( tblxt_role.role_code = tblxt_user.role_code ) and ';
str_sql := str_sql + ' ( tblxt_user.ward_code = tblzy_adtward.ward_code ) and ';
str_sql := str_sql + ' (tblxt_user.delete_flag = 0 OR tblxt_user.delete_flag = null ) AND ';
str_sql := str_sql + ' tblxt_user.check_flag= 1 and tblxt_user.ward_code = :ward_code AND ';
str_sql := str_sql + ' tblxt_role.subsys = ''ys'' AND tblxt_role.role_name <> ''护士'' ORDER BY tblxt_role.role_code ASC';
with qry_dw_checker2 do
begin
close;
sql.Clear;
sql.Add(str_sql);
Parameters.ParamByName('ward_code').Value := gv_ward_code;
open;
end;
ClientDataSet2.FieldDefs.Clear;
for i:=0 to qry_dw_checker2.FieldCount-1 do
begin
with ClientDataSet2.FieldDefs.AddFieldDef do
begin
Name:=qry_dw_checker2.Fields[i].DisplayName;
if qry_dw_checker1.Fields.Fields[i].DataType=ftAutoInc then
DataType:=ftInteger
else if qry_dw_checker1.Fields.Fields[i].DataType=ftWideString then
DataType:=ftString
else
DataType :=qry_dw_checker2.Fields.Fields[i].DataType;//取原数据字段数据类型
Size:=qry_dw_checker2.Fields.Fields[i].Size;
end;
end;
ClientDataSet2.CreateDataSet;
ds_checker2.DataSet := qry_dw_checker2;
dw_checker2.DataController.DataSource := ds_checker2;
dw_checker2.ClearItems;
dw_checker2.CreateColumn;//建立一个没绑定的列
dw_checker2.Columns[0].Caption:='选择';
dw_checker2.DataController.CreateAllItems;//建立所有绑定的列
// dw_checker1.Columns[0].DataBinding.FieldName := 'flag';
dw_checker2.Columns[0].Width:=45;
//下列5行语句是为了让没绑定列成为 CheckBox :
dw_checker2.DataController.KeyFieldNames:='user_code';
dw_checker2.DataController.MasterKeyFieldNames := 'user_code';
dw_checker2.DataController.DetailKeyFieldNames := 'user_code';
dw_checker2.DataController.DataModeController.SmartRefresh:=true;
dw_checker2.Columns[0].DataBinding.ValueType:='Boolean';
dw_checker2.Columns[0].PropertiesClass:= TcxCheckBoxProperties;
(dw_checker2.Columns[0].Properties as TcxCheckBoxProperties).NullStyle:=nssUnchecked;
//由于CheckBox列是动态列,所以需要给其关联一个OnChange的事件:
(dw_checker2.Columns[0].Properties as TcxCheckBoxProperties).OnChange:=View_UpCheckBoxColumnPropertiesChange;//关联事件
dw_checker2.OptionsView.Indicator:=true;
dw_checker2.OptionsView.NoDataToDisplayInfoText := '';
5.定义单击事件
a.令checkbox单选
procedure Tfrm_w_checker.dw_checker2CellClick(Sender: TcxCustomGridTableView;
ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
AShift: TShiftState; var AHandled: Boolean);
var
Row: Integer;
begin
inherited;
//单选
for Row:=0 to dw_checker2.DataController.RecordCount-1 do
begin
dw_checker2.ViewData.Records[Row].Values[0] := False;
end;
end;
b.令checkbox多选
procedure Tfrm_w_add_job.dw_add_jobMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
Row: Integer;
begin
inherited;
//多选
if dw_add_job.DataController.RecordCount<>0 then
begin
Row := dw_add_job.DataController.FocusedRecordIndex;
if dw_add_job.ViewData.Records[Row].Values[1] = True then
dw_add_job.ViewData.Records[Row].Values[1] := False
else
dw_add_job.ViewData.Records[Row].Values[1] := True;
end;
end;
方法二:数据库中添加bit字段。
方法三:
鉴于本人首次设定cxGrid的CheckBox的时候费了很大劲,发现很多人都会碰到这个问题,现在总结一下,以供各位互相学习借鉴。
步骤如下(不分先后):
1、 cxGrid添加完自己所需的所有字段后,增加一个字段用来显示CheckBox勾选框,比如叫做Selected(至于Caption要不要设定,看 你自己喜欢是否想看到栏位名称了),那么tableview中此字段的DataBinding下面的FieldName就设为Selected,并注意 Options中的Editing要为True,还要设定Properties属性的ValueChecked属性和ValueUnchecked属性,这里比如分别设定为'Y','N'。
2、 设定cxGrid所连接的DataSource对应的ClientDataset,编辑ClientDataset,增加自己正常需要的所有字段,然后再 增加一个单独作为我们设定的用来显示勾选的字段,前面已经有名字了'Selected'(宽度设定大于2个字节都可以了,也就是为了保存之前设定的'Y' 或者'N',属性是WildString),需要注意的是:FieldType一定要选择fkInternalCalc,当然FieldName也是'Selected'。
3、在cxGrid的TableView的OnCellDblclick事件中写勾选与否的点击处理代码,比如如下例子:
procedure TfrmImmunIseplanAdd.cxGrid1DBTableView1CellDblClick(
Sender: TcxCustomGridTableView;
ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
AShift: TShiftState; var AHandled: Boolean);
begin
inherited;
cdsGROWSORT.Edit ;
if cdsGROWSORT.FieldByName('Selected').AsString ='N' then
cdsGROWSORT.FieldByName('Selected').AsString:='Y'
else
cdsGROWSORT.FieldByName('Selected').AsString:='N';
end;
4、初始化勾选栏位,否则就是灰色的而且已经勾选了,如何初始化,基本上就是遍历ClientDataSet然后把'Selected'字段值赋值为'N',也就是非勾选状态。比如如下例子:
if (cdsGROWSORT.Active) and (cdsGROWSORT.RecordCount>0) then
begin
cdsGROWSORT.First;
while not cdsGROWSORT.Eof do
begin
cdsGROWSORT.Edit ;
cdsGROWSORT.FieldByName('Selected').AsString :='N';
cdsGROWSORT.Next;
end;
end;
注意:如果说cxGrid有很多数据记录要在窗口打开的时候就显示出来,那么你的ClientDataset的SQL语句不可以有'Selected'这个字段,也就是说这个字段不在你的数据查询记录中,不和数据库关联。
以上四个步骤不分先后,只要一一都这样设定一定可以实现想要的勾选框了。第一次写,呵呵,还真是费脑筋,就当作给自己一个加深印象的事情吧,呵呵。
--------------------------------------------------------------------
ClientDataSet1.FieldDefs.Clear;
for i:=0 to dmMZYS.adoyzjl.FieldCount-1 do
begin
with ClientDataSet1.FieldDefs.AddFieldDef do
begin
Name:=dmMZYS.adoyzjl.Fields[i].DisplayName;
if dmMZYS.adoyzjl.Fields.Fields[i].DataType=ftAutoInc then
DataType:=ftInteger
else if dmMZYS.adoyzjl.Fields.Fields[i].DataType=ftWideString then
DataType:=ftString
else
DataType :=dmMZYS.adoyzjl.Fields.Fields[i].DataType;//取原数据字段数据类型
Size:=dmMZYS.adoyzjl.Fields.Fields[i].Size;
end;
end;
ClientDataSet1.CreateDataSet;
dmMZYS.dsyzjl.DataSet := dmMZYS.adoyzjl;
cxyzjl.DataController.DataSource := dmMZYS.dsyzjl;
// cxyzjl.ClearItems;
// cxyzjl.CreateColumn;//建立一个没绑定的列
cxyzjl.Columns[0].Caption:='选择';
// cxyzjl.DataController.CreateAllItems;//建立所有绑定的列
// dw_checker1.Columns[0].DataBinding.FieldName := 'flag';
cxyzjl.Columns[0].Width:=45;
//下列5行语句是为了让没绑定列成为 CheckBox :
cxyzjl.DataController.KeyFieldNames:='recn';
cxyzjl.DataController.MasterKeyFieldNames := 'recn';
cxyzjl.DataController.DetailKeyFieldNames := 'recn';
cxyzjl.DataController.DataModeController.SmartRefresh:=true;
cxyzjl.Columns[0].DataBinding.ValueType:='Boolean';
cxyzjl.Columns[0].PropertiesClass:= TcxCheckBoxProperties;
(cxyzjl.Columns[0].Properties as TcxCheckBoxProperties).NullStyle:=nssUnchecked;
//由于CheckBox列是动态列,所以需要给其关联一个OnChange的事件:
(cxyzjl.Columns[0].Properties as TcxCheckBoxProperties).OnChange:=View_UpCheckBoxColumnPropertiesChange;//关联事件
cxyzjl.OptionsView.Indicator:=true;
cxyzjl.OptionsView.NoDataToDisplayInfoText := '';
本文转自鹅倌51CTO博客,原文链接: http://blog.51cto.com/kaixinbuliao/1052004,如需转载请自行联系原作者