如何在cxgrid中添加checkbox.docx
《如何在cxgrid中添加checkbox.docx》由会员分享,可在线阅读,更多相关《如何在cxgrid中添加checkbox.docx(8页珍藏版)》请在冰点文库上搜索。
如何在cxgrid中添加checkbox
如何在cxgrid中添加checkbox
如何在cxgrid中添加checkbox2012-11-0620:
43:
04
标签:
checkboxcxgriddelphi
原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。
否则将追究法律责任。
方法一
1,添加单元文件cxCheckBox,窗体添加clientDataset,datasource,adoquery,cxgrid
2,添加类声明
type
TCheckBoxClickEvent=procedure(Sender:
TObject)ofobject;
type
TCheckBoxClick=class(TObject)
private
FOnCheckBoxClick:
TCheckBoxClickEvent;//定义一个内部事件,private里的只能在类内部调用
public
propertyView_UpCheckBoxColumnPropertiesChange:
TCheckBoxClickEventreadFOnCheckBoxClickwriteFOnCheckBoxClick;//定义一个外部的事件
end;
在public中,添加方法
procedureView_UpCheckBoxColumnPropertiesChange(Sender:
TObject);
3方法实现,根据checkbox状态设置语句
procedureTfrm_w_checker.View_UpCheckBoxColumnPropertiesChange(Sender:
TObject);
begin
////////////////////////////////////////////////////
ifdw_checker2.Focused=truethen
if(SenderasTcxCheckBox).checkedthen
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:
='SELECTtblxt_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+'FROMtblxt_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=0ORtblxt_user.delete_flag=null)AND';
str_sql:
=str_sql+'tblxt_user.check_flag=1andtblxt_user.ward_code=:
ward_codeAND';
str_sql:
=str_sql+'tblxt_role.subsys=''ys''ANDtblxt_role.role_name<>''护士''ORDERBYtblxt_role.role_codeASC';
withqry_dw_checker2do
begin
close;
sql.Clear;
sql.Add(str_sql);
Parameters.ParamByName('ward_code').Value:
=gv_ward_code;
open;
end;
ClientDataSet2.FieldDefs.Clear;
fori:
=0toqry_dw_checker2.FieldCount-1do
begin
withClientDataSet2.FieldDefs.AddFieldDefdo
begin
Name:
=qry_dw_checker2.Fields[i].DisplayName;
ifqry_dw_checker1.Fields.Fields[i].DataType=ftAutoIncthen
DataType:
=ftInteger
elseifqry_dw_checker1.Fields.Fields[i].DataType=ftWideStringthen
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].PropertiesasTcxCheckBoxProperties).NullStyle:
=nssUnchecked;
//由于CheckBox列是动态列,所以需要给其关联一个OnChange的事件:
(dw_checker2.Columns[0].PropertiesasTcxCheckBoxProperties).OnChange:
=View_UpCheckBoxColumnPropertiesChange;//关联事件
dw_checker2.OptionsView.Indicator:
=true;
dw_checker2.OptionsView.NoDataToDisplayInfoText:
='';
5.定义单击事件
a.令checkbox单选
procedureTfrm_w_checker.dw_checker2CellClick(Sender:
TcxCustomGridTableView;
ACellViewInfo:
TcxGridTableDataCellViewInfo;AButton:
TMouseButton;
AShift:
TShiftState;varAHandled:
Boolean);
var
Row:
Integer;
begin
inherited;
//单选
forRow:
=0todw_checker2.DataController.RecordCount-1do
begin
dw_checker2.ViewData.Records[Row].Values[0]:
=False;
end;
end;
b.令checkbox多选
procedureTfrm_w_add_job.dw_add_jobMouseUp(Sender:
TObject;
Button:
TMouseButton;Shift:
TShiftState;X,Y:
Integer);
var
Row:
Integer;
begin
inherited;
//多选
ifdw_add_job.DataController.RecordCount<>0then
begin
Row:
=dw_add_job.DataController.FocusedRecordIndex;ifdw_add_job.ViewData.Records[Row].Values[1]=Truethen
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事件中写勾选与否的点击处理代码,比如如下例子:
procedureTfrmImmunIseplanAdd.cxGrid1DBTableView1CellDblClick(
Sender:
TcxCustomGridTableView;
ACellViewInfo:
TcxGridTableDataCellViewInfo;AButton:
TMouseButton;
AShift:
TShiftState;varAHandled:
Boolean);
begin
inherited;
cdsGROWSORT.Edit;
ifcdsGROWSORT.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;
whilenotcdsGROWSORT.Eofdo
begin
cdsGROWSORT.Edit;
cdsGROWSORT.FieldByName('Selected').AsString:
='N';
cdsGROWSORT.Next;
end;
end;
注意:
如果说cxGrid有很多数据记录要在窗口打开的时候就显示出来,那么你的ClientDataset的SQL语句不可以有'Selected'这个字段,也就是说这个字段不在你的数据查询记录中,不和数据库关联。
以上四个步骤不分先后,只要一一都这样设定一定可以实现想要的勾选框了。
第一次写,呵呵,还真是费脑筋,就当作给自己一个加深印象的事情吧,呵呵。