如何在cxgrid中添加checkbox

简介:

方法一

  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,如需转载请自行联系原作者




相关文章
|
6月前
|
Python
Combobox
在Tkinter中,下拉菜单(Combobox)是一种常用的组件,它允许用户从一组预定义的选项中选择一个或多个值。下面是关于如何在Tkinter中使用下拉菜单组件的详细说明:
52 1
|
5月前
|
JavaScript 前端开发
详细解读checkbox的全选与反选
详细解读checkbox的全选与反选
44 0
|
JavaScript 前端开发
一行jQuery代码搞定checkbox 全选和全不选
一行jQuery代码搞定checkbox 全选和全不选
|
JavaScript 前端开发 Java
|
SQL
Combox中的TextChanged和TextUpdate
最近项目用到了combox的这两个事件 TextChanged和TextUpdate: 1如果是从下拉框里选择的数值的话 只会发生TextChanged事件 2如果是修改text属性 会先发生 TextUp...
1480 0
|
前端开发 Android开发
CheckBox
写一个带动画化效果的CheckBox,先看效果,我觉得这个尺寸是最好看的,画图板画出来的,有点丑啊。。 003.png 000.
936 0
|
JavaScript
GridView与CheckBox完美结合
版本一:单纯地实现全选和全取消,http://www.cnblogs.com/insus/archive/2009/03/14/1411613.html 版本二:修改选中行的背景颜色,http://www.cnblogs.com/insus/archive/2013/01/20/2868532.html           关于第二篇的修正: 最后一段代码好像有些问题:function SelectedAll(cb) {cb.checked = cb.checked ? false : true;这个地方,会使得标题行的复选框无法选中。
653 0