我想实现的功能是:选中cxgrid中多行记录进行删除,但是字段a是true的时候不能删除,请问该怎么实现啊?
并且能在执行删除前给一个提示:“XX,XX可以删除,xx,xx不可以删除,是否确认执行删除操作?”
如果点是的话就删除,否则就保留选中的记录,请问各位大侠该怎么实现啊?

解决方案 »

  1.   

    就 Adoquery,adodataset  的 beforeDelete  事件中寫更方便些。
      

  2.   

    循环选中记录,检查每条记录的字段a是否为true
      

  3.   

    针对Clientdateset操作。。
    var
      s,s1: string;s1 := "XX,XX可以删除,xx,xx不可以删除,是否确认执行删除操作?" 
    ClientDataSet1.First;
    for i = 0 to ClientDataSet1.RecordCount-1 do
    begin
      if ClientDataSet1.FieldValues['a'] then
        s := '当前字段为True'
      else
        s := '当前字段为False';
      if MessageBox(handle,pchar(s1), pchar(s), MB_OKCANCEL) = MB_OK  then
         ClientDataSet1.Delete
      else
         ClientDataSet1.Next;
    end;
      

  4.   

    用的是cxgrid显示查询结果,然后选中cxgrid中的记录来删除,选中的删,不选的不删,该怎么做?中间还要判断字段a是不是为true
      

  5.   

    你按鍵盤上的Delete鍵試試(optionsdata-deleting-true)procedure TRES_SOP_F.btnSB_DelClick(Sender: TObject);
    var
      sop_id:Integer;
    begin
      inherited;
      if not qry_main.IsEmpty then
      begin
        if MessageDlg('你確定要刪除你所選擇的記錄嗎?',mtWarning,[mbYes,mbNo],0)=idyes then
        begin
          img1.Picture:=nil;
          sop_id:=qry_main.fieldbyname('sop_id').AsInteger;
          qry_main.Delete;
          qry_op.Close;
          qry_op.SQL.Text:='delete from sop_pn where sop_id='''+inttostr(sop_id)+'''';
          qry_op.ExecSQL;
          qry_op.Close;
          qry_op.SQL.Text:='delete from SOP_IMG where sop_id='''+inttostr(sop_id)+'''';
          qry_op.ExecSQL;
        end;
      end;
    end;
      

  6.   

    这个方法很简单,也有很多方法.
    多行删除
    1,通过在sql语句中加入convert(char(1),'N') as XZ 在query中把XZ加入进来,在grid中把加入进来,
      在grid中把除了XZ其他字段改为只读,加入update控件指定数据源但是不写更新语句,当你双吉起用qry.edit;  XZ:='Y' qry.post;
    2,其他方法通过grid中自带的mutliSelect属性
    删除时判断
    1,采用GRID书签 MySelected: TBookList;MySelected := grdRightCK.SelectedRows;qryCK.Book := MySelected[iloop];来定位你选择记录然后qryCK.FieldByName('')来取然后判断判断可以用MessageBox(0,PCHAR('内容'),PCHAR('标题'),MB_YESNO)有返回值;返回值IDYES = 6;IDNO = 7;来判断用户选择了yes还是no. 
    2,边历qry判断是否选择了XZ ='Y',如果是则操作.
    楼主多写写,不要因为把别人的代码拷过来能用了就开心,原理懂了更开心.
      

  7.   

       with cxGrid1DBTableView1.DataController.DataSource.DataSet do
       begin
         for i:= 0 to cxGrid1DBTableView1.ViewData.RowCount-1  do
         begin
           if  cxGrid1DBTableView1.ViewData.Rows[i].Selected then
           begin
             GotoBook(Pointer(cxGrid1DBTableView1.ViewData.Rows[i]));
            if FieldByName('ccode').AsBoolean then
            usehook := usehook + fieldbyname('ccode').AsString+','
           else
            delhook := delhook + fieldbyname('ccode').AsString+',';
            end;
         end;
       end;
    给位,看一下,我的代码是这样的,我的意思是将可以删除的存在delhook中,不能删除的放在usehook中,可是在循环的时候执行到gotobook的时候提示i越界,怎么回事啊,能不能给个提示?
      

  8.   

       with  cxGridTaxTkTv.DataController do begin
          for j := 0 to RowCount - 1 do begin        for i := 0 to RowCount - 1 do begin
              if Values[i,cxGridTaxTkTvColumnSelected.Index] then begin //此项判断是否选中它可以设置为CheckBox类型让用户选择
                DeleteRecord(i);
                Break;
              end;
            end;      end;
        end;
      

  9.   

    加一個checkbox類型的字段(復選框)這樣更好
      

  10.   


    procedure TForm1.Button1Click(Sender: TObject);
    var
      i : integer;
      sID : string;
      adotmp : TADOQuery;
    begin
      //Values[0] 为字段a
      //Values[1] 为标识字段
      //cxgrdItemList 为cxGrid
      sID := '0';
      for i := 0 to cxgrdItemList.DataController.Controller.SelectedRecordCount - 1 do
      begin
        if cxgrdItemList.DataController.Controller.SelectedRecords[i].Values[0] = True then
          continue;
        sID := sID + ', ' + cxgrdItemList.DataController.Controller.SelectedRecords[i].Values[1];
      end;
      adotmp := TADOQuery.Create(nil);
      with adotmp do
      try
        {自己写
        Connection := ;
        }
        sql.Text := 'delete from yTbName where ID in (' + sID + ')';
        ExecSQL;  finally
        free;
        //刷新一下cxgrid的dataset;
      end;end;