procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
CtrlState: array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
begin
if Column.Field.FieldName = 'zt' then
begin
DBGrid1.Canvas.FillRect(Rect);
DrawFrameControl(DBGrid1.Canvas.Handle,Rect, DFC_BUTTON, CtrlState[Column.Field.AsBoolean]);
end;end;procedure TForm1.DBGrid1CellClick(Column: TColumn);
var
  Sql1:String;
begin
if Column.Field.FieldName ='zt' then
  begin
  with DBGrid1.DataSource.DataSet do
  begin
  if state<>dsEdit then Edit;
  Column.Field.AsBoolean:= Not Column.Field.AsBoolean;  if Column.Field.AsBoolean then
  FieldByNAME('zt').AsBoolean:=True
  ELSE
  FieldByNAME('zt').AsBoolean:=False;
  end;
  end;
end;

解决方案 »

  1.   

    此貼重複發了幾次,直接update數據庫中的那個字段值就OK了...
      

  2.   

    其實方法有很多種的,掛數據庫字段值的是最常見和最簡單的了看看我這個:procedure Tsys_user_f.dxdbg_rightColumnClick(Sender: TObject;
      Column: TdxDBTreeListColumn);
    var
      iLoop,I:Integer;
    begin
      inherited;
      if HaveRight(FModuleID,_UserNo,rModify) and (not btnSB_Setup.Enabled) then
      begin
        if Column.FieldName<>'modulename' then
        begin
          qry_right.First;
          if qry_right.FieldByName(Column.FieldName).AsInteger=0 then
            I:=1 else
            I:=0;
          for iLoop:=0 to  Column.ATreeList.Count-1 do
          begin
            qry_right.Edit;
            qry_right.FieldByName(Column.FieldName).AsInteger:=I;
            qry_right.Post;
            qry_right.Next;
          end;
        end;
      end;
    end;
      

  3.   

    沒有關係,慢慢理解,認真研究,理清思路 if not qry_HrYd.IsEmpty then
        begin
          qry_HrYd.First;
          if qry_HrYd.FieldByName('YDDCheck').AsBoolean then
          begin
            C:='0';
            btnSB_Search.Caption:='批量全選';
          end else
          begin
            C:='1';
            btnSB_Search.Caption:='批量反選';
          end;
          qry_HrYd.Close;
          if (Trim(_KyeYdZJQF)<>'') then
          begin
            if (Trim(cbb_cb.Text)<>'')or (Trim(cbb_kb.Text)<>'')or (Trim(cbb_zxb.Text)<>'') then
            begin
              if cbb_cb.Text<>'' then
                sWhere:=sWhere+' CB='''+cbb_cb.Text+'''';
              if cbb_kb.Text<>'' then
                sWhere:=sWhere+' and KB='''+cbb_kb.Text+'''';
              if cbb_zxb.Text<>'' then
                sWhere:=sWhere+' and XB='''+cbb_zxb.Text+'''';
              if cbb_bc.Text<>'' then
                sWhere:=sWhere+' and BC='''+cbb_bc.Text+'''';
              if cbb_gh.Text<>'' then
                sWhere:=sWhere+' and Account_ID='''+cbb_gh.Text+'''';
              qry_getoppo.Close;
              qry_getoppo.SQL.Text:='Update Res_User_Temp set YDDCheck='''+C+'''  where '+sWhere;
              qry_getoppo.ExecSQL;
            end;
          qry_HrYd.Open;
          end;
      

  4.   

    這裡:
    1.
    if qry_HrYd.FieldByName('YDDCheck').AsBoolean then //判斷checkbox的狀態,是否勾選
    2.
       C:='0';//勾選狀態值
            btnSB_Search.Caption:='批量全選';
          end else
          begin
            C:='1';//非勾選狀態值
            btnSB_Search.Caption:='批量反選';
    3.      
    qry_getoppo.Close;
              qry_getoppo.SQL.Text:='Update Res_User_Temp set YDDCheck='''+C+'''  where '+sWhere;//更新數據庫中的相關數據,使之同步
              qry_getoppo.ExecSQL;
      

  5.   

    where '+sWhere更新的时候怎么判断是我点击的那个CheckBox
      

  6.   

    大姐,你POST了吗?
    procedure TForm1.DBGrid1CellClick(Column: TColumn);
    var
      Sql1:String;
    begin
    if Column.Field.FieldName ='zt' then
      begin
      with DBGrid1.DataSource.DataSet do
      begin
      if state<>dsEdit then Edit;//这里EDIT了,你最后没POST
      Column.Field.AsBoolean:= Not Column.Field.AsBoolean;  if Column.Field.AsBoolean then
      FieldByNAME('zt').AsBoolean:=True
      ELSE
      FieldByNAME('zt').AsBoolean:=False;
      POST;
      end;
      end;
    end;
      

  7.   

    给你回复的代码都没拷全,你需要休息休息,放松下大脑了。
    看样子你DBGRID的数据集是个ADOQUERY控件吧,就让它专门做数据集,执行别的SQL语句不要使用这个ADOQUERY控件了,用别的ADOQUERY控件
      

  8.   

    更新的时候的WHERE条件怎么写   判断是我点击的那个CheckBox这个UPADATE怎么写告诉我下我今天就不麻烦大家了  
      

  9.   

    我试了,象下面这样写都可以,数据集控件用的ADOQUERY,ADO后台会自动产生Update语句,根本就不需要你自己去写UPDATE,DBGrid1CellClick加上Column.Field.FieldName ='zt'这个条件的意思就是你点了你鼠标所在的CheckBox,把你DBGRID的readonly属性设为FALSE,把DBGRID的Option下的dgRowSelect属性设为FALSE
    procedure TForm1.DBGrid1CellClick(Column: TColumn);
    begin
    if Column.Field.FieldName ='zt' then
      begin
       with DBGrid1.DataSource.DataSet do
         begin
           if state<>dsEdit then
              Edit;
              Column.Field.AsBoolean:= Not Column.Field.AsBoolean;
              Post;
         end;
      end;
    end;
      

  10.   

    procedure TForm1.DBGrid1CellClick(Column: TColumn);
    begin
    if Column.Field.FieldName ='zt' then
      begin
      with adoquery1 do
      begin
      if state<>dsEdit then Edit;
      Column.Field.AsBoolean:= Not Column.Field.AsBoolean;
      Post;
      UpdateBatch;
      end;
      end;
    end;这样就可以了    哇哇 ~~~  没有UPDATE   今天不看代码啦   
      

  11.   


    樓主與我是“愁人”?如果說當有一批數據時,直接循環判斷這些checkbox有沒有勾選就可以了啊最後還有刷新一下數據庫即可.......