转:http://blog.csdn.net/xjjrocker/article/details/1195366
    http://wenku.baidu.com/link?url=QMoUDkXCYJNu5Eu1TmAsfNWBsvewZnY_0ZKJ_afgnlDJTATLaPxBBPk_8ohFH3Nn26KSRKLXsHgtjfS8cSw73cIGVDdDBUNKl2gPvnGKTNi
    鉴于本人首次设定cxGrid的CheckBox的时候费了很大劲,发现很多人都会碰到这个问题,现在总结一下,以供各位互相学习借鉴。
    步骤如下(不分先后):
    1、 cxGrid添加完自己所需的所有字段后,增加一个字段用来显示CheckBox勾选框,比如叫做Selected(至于Caption要不要设定,看你自己喜欢是否想看到栏位名称了),那么tableview中此字段的DataBinding下面的FieldName就设为Selected,并注意Options中的Editing要为True,还要设定Properties属性选择CheckBox,然后选择下面的ValueChecked属性和ValueUnchecked属性,这里比如分别设定为’Y’,’N’。,设置1,0最好
    2、设定cxGrid所连接的DataSource对应的ClientDataset,编辑ClientDataset,增加自己正常需要的所有字段,然后再增加一个单独作为我们设定的用来显示勾选的字段,前面已经有名字了’Selected’(宽度设定大于2个字节都可以了,也就是为了保存之前设定的’Y’或者’N’,属性是String),需要注意的是: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’这个字段,也就是说这个字段不在你的数据查询记录中,不和数据库关联。
    以上四个步骤不分先后,只要一一都这样设定一定可以实现想要的勾选框了。第一次写,呵呵,还真是费脑筋,就当作给自己一个加深印象的事情吧,呵呵。
    //==========自己的代码
    procedure TFrm_statcardcontinue.gridview_statcardcontinueCellDblClick(
    Sender: TcxCustomGridTableView;
    ACellViewInfo: TcxGridTableDataCellViewInfo; AButton: TMouseButton;
    AShift: TShiftState; var AHandled: Boolean);
    begin
    inherited;
    with dm_stat.ADOQuery_statcardcontinue do
    begin
    Edit;
    if ( FieldByName(‘Selected’).AsString = ‘0’ ) or (FieldByName(‘Selected’).AsString = ‘’) then
    FieldByName(‘Selected’).AsString := ‘1’
    else
    FieldByName(‘Selected’).AsString := ‘0’;
    end;
    end;
    procedure TFrm_statcardcontinue.btnSelectAllClick(Sender: TObject);
    begin
    with dm_stat.ADOQuery_statcardcontinue do
    if (active) and (RecordCount>0) then
    begin
    First;
    while not Eof do
    begin
    Edit ;
    FieldByName(‘Selected’).AsString :=’1’;
    Next;
    end;
    end;
    end;
    procedure TFrm_statcardcontinue.btnReverseClick(Sender: TObject);
    begin
    with dm_stat.ADOQuery_statcardcontinue do
    if (active) and (RecordCount > 0) then
    begin
    First;
    while not Eof do
    begin
    Edit;
    if FieldByName(‘Selected’).AsString = ‘1’ then
    FieldByName(‘Selected’).AsString := ‘0’
    else
    FieldByName(‘Selected’).AsString := ‘1’;
    Next;
    end;
    end;
    end;
    procedure TFrm_statcardcontinue.act_deleteallExecute(Sender: TObject);
    var
    sqlstr: string;
    flagSelected:Boolean;
    begin
    flagSelected := false;
    if not Frm_main.Act_delrecord.Enabled then
    begin
    CRMWarningDialog(‘您无此权限,请和管理员联系!’);
    abort;
    end;
    with dm_stat.ADOQuery_statcardcontinue do
    try
    DisableControls;
    if (active) and (RecordCount > 0) then
    begin
    First;
    while not Eof do
    begin
    if FieldByName(‘Selected’).AsString = ‘1’ then
    begin
    flagSelected := True;
    break;
    end;
    Next;
    end
    end
    else
    begin
    CRMWarningDialog(‘没有记录,不能删除!’);
    abort;
    end;
    finally
    EnableControls;
    end;
    if (not flagSelected) then
    begin
    CRMWarningDialog(‘没有记录,不能删除!’);
    abort;
    end;
    if CRMQueryDialog(‘系统提示:只删除消费信息!’#13#13’确实要删除选择的消费信息吗?’) then
    begin
    with dm_stat.ADOQuery_statcardcontinue do
    if (active) and (RecordCount > 0) then
    try
    DisableControls;
    First;
    while not Eof do
    begin
    if (FieldByName(‘Selected’).AsString = ‘1’) and (FieldByName(‘type’).asstring = ‘消费’) then
    begin
    sqlstr := ‘exec sp_deletexf ‘ + quotedstr(FieldByName(‘billno’).asstring) + ‘,’ + quotedstr(Suser) + ‘,’ + quotedstr(Sshop_id) + ‘,’ + quotedstr(Sshop);
    sqlexecsql(dm.ADOquery_temp, sqlstr, false);
    end;
    Next;
    end;
    Act_search.Execute;
    finally
    EnableControls
    end;
    end;
    end;