用adoquery连接MSSQL的northwind数据库, 
使用select   '0 '   as   checked,   shipname   from   orders 
查询结果数据显示在DBGridEh1中。 
双击DBGridEh1加入所有数据列,然后编辑checked列的checkboxes属性为true。 
想让可以打对号的checked列,可以编辑。如何实现? 
(虚拟的数据源字段select   '0 '   as   checked,如何可以实现编辑?adoquery开缓存模式) 目前只知道在Query中可以实现。adoquery没找到实现方法,有知道的高手还请指点! 

解决方案 »

  1.   

    前面不是有人回了吗????
    如果在SQL语句中增加那么一列,就是类似常数的一列,是不能修改的。
    如果想增加一列计算列,可以在ADOQuery中增加。
      

  2.   

    你这样破坏了数据集结构 你在Query中是怎么实现的?
      

  3.   

    我之前写过,现在给你吧
    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, StdCtrls, Buttons, Grids, DBGrids;type
      TForm2 = class(TForm)
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        BitBtn1: TBitBtn;
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        ADOQuery1selected: TBooleanField;
        ADOQuery1Number: TStringField;
        ADOQuery1gh: TStringField;
        ADOQuery1bumen_bh: TStringField;
        ADOQuery1name: TStringField;
        ADOQuery1sex: TStringField;
        ADOQuery1BirthDate: TDateTimeField;
        ADOQuery1NativePlace: TStringField;
        ADOQuery1Folk: TStringField;
        ADOQuery1Position: TStringField;
        ADOQuery1Diploma: TStringField;
        ADOQuery1IdentityCard: TStringField;
        ADOQuery1FamilyAddress: TStringField;
        ADOQuery1IdentityCardAddress: TStringField;
        ADOQuery1InDutyDate: TDateTimeField;
        ADOQuery1InDueFormDate: TDateTimeField;
        ADOQuery1PactEndDate: TDateTimeField;
        ADOQuery1SocialSecurityNumber: TStringField;
        ADOQuery1MedicalTreatment: TStringField;
        ADOQuery1Introducer: TStringField;
        ADOQuery1CurState: TStringField;
        ADOQuery1Photo: TStringField;
        ADOQuery1CardNo: TStringField;
        ADOQuery1password: TStringField;
        ADOQuery1Status: TStringField;
        ADOQuery1Basic_Wage: TBCDField;
        ADOQuery1DutyWage: TBCDField;
        ADOQuery1Age_Wage: TBCDField;
        ADOQuery1Housing_Fill: TBCDField;
        ADOQuery1Secrecy_Toll: TBCDField;
        ADOQuery1Phone_Toll: TBCDField;
        ADOQuery1Meal_Fill: TBCDField;
        ADOQuery1Overtime_Fill: TBCDField;
        ADOQuery1Achievement_Assess: TBCDField;
        ADOQuery1person_No1: TStringField;
        ADOQuery1Person_Name1: TStringField;
        ADOQuery1Dept_Name1: TStringField;
        ADOQuery1Date1: TDateTimeField;
        ADOQuery1Person_No2: TStringField;
        ADOQuery1Person_Name2: TStringField;
        ADOQuery1Dept_Name2: TStringField;
        ADOQuery1Date2: TDateTimeField;
        ADOQuery1Person_No3: TStringField;
        ADOQuery1Person_Name3: TStringField;
        ADOQuery1Dept_Name3: TStringField;
        ADOQuery1Date3: TDateTimeField;
        ADOQuery1Enable: TStringField;
        ADOQuery1Memo: TStringField;
        ADOQuery1Person_Number: TStringField;
        ADOQuery1OutDutyDate: TDateTimeField;
        ADOQuery1Is_KaoQin: TBooleanField;
        ADOQuery1Insurance: TBCDField;
        ADOQuery1password2: TStringField;
        ADOQuery1TryOut_Salary: TBCDField;
        ADOQuery1Formal_Salary: TBCDField;
        ADOQuery1DSDesigner: TBCDField;
        ADOQuery1DSDesigner2: TBCDField;
        ADOQuery1DSDesigner3: TBCDField;
        ADOQuery1DSDesigner4: TBCDField;
        ADOQuery1DSDesigner5: TBCDField;
        ADOQuery1DSDesigner6: TBCDField;
        ADOQuery1DSDesigner7: TBCDField;
        ADOQuery1DSDesigner8: TBCDField;
        ADOQuery1DSDesigner9: TBCDField;
        ADOQuery1Is_Two_Salary: TBooleanField;
        ADOQuery1DSDesigner10: TBCDField;
        ADOQuery1DSDesigner11: TBCDField;
        ADOQuery1DSDesigner12: TBCDField;
        ADOQuery1is_month_salary: TBooleanField;
        ADOQuery1level: TStringField;
        ADOQuery1is_jijian: TBooleanField;
        ADOQuery1ExecDate: TStringField;
        ADOQuery1New_Level: TStringField;
        ADOQuery1school: TStringField;
        ADOQuery1specialty: TStringField;
        ADOQuery1temp_level: TStringField;
        ADOQuery1temp_execdate: TStringField;
        procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumn; State: TGridDrawState);
        procedure DBGrid1ColEnter(Sender: TObject);
        procedure DBGrid1ColExit(Sender: TObject);
        procedure DBGrid1CellClick(Column: TColumn);
        procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
        procedure FormShow(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
      private
        { Private declarations }
        OriginalOptions : TDBGridOptions;
        List:TStringList;
        procedure SaveBoolean;  public
        { Public declarations }
      end;var
      Form2: TForm2;implementation{$R *.dfm}procedure TForm2.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.DataType =ftBoolean Then
       Begin
          Dbgrid1.Canvas.FillRect(rect);
          DrawframeControl(dbgrid1.Canvas.Handle,rect,DFC_BUTTON,CtrlState[Column.Field.asBoolean]);
       End;end;procedure TForm2.DBGrid1ColEnter(Sender: TObject);
    begin
       If Dbgrid1.SelectedField.DataType =ftBoolean Then
       Begin
          OriginalOptions :=DBgrid1.Options;
          Dbgrid1.Options :=Dbgrid1.Options -[dgEditing];
       End;end;procedure TForm2.DBGrid1ColExit(Sender: TObject);
    begin
       If Dbgrid1.SelectedField.DataType =ftBoolean Then
       Begin
          Dbgrid1.Options :=OriginalOptions;
       End;end;procedure TForm2.DBGrid1CellClick(Column: TColumn);
    begin
       If (Dbgrid1.SelectedField.DataType =ftBoolean) And (Column.ID =1) Then
          SaveBoolean();
    end;procedure TForm2.SaveBoolean;
    Begin
       Dbgrid1.SelectedField.DataSet.Edit ;
       Dbgrid1.SelectedField.AsBoolean :=Not Dbgrid1.SelectedField.AsBoolean;   If Dbgrid1.SelectedField.AsBoolean =True Then
          List.Add(Adoquery1gh.AsString)
       Else
       Begin
          If List.IndexOf(Adoquery1gh.AsString )>=0 Then
             List.Delete(list.IndexOf(Adoquery1gh.AsString) );
       End;
       Dbgrid1.SelectedField.DataSet.Post ;End;procedure TForm2.DBGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
       If (Key=VK_SPACE) And (Dbgrid1.SelectedField.DataType =ftBoolean ) Then
          SaveBoolean();end;procedure TForm2.FormShow(Sender: TObject);
       Var
          strSql:string;
    begin
       strSql:='IF Object_id(''tempdb..#'' ) IS NOT NULL  DROP TABLE # ' +
               'SELECT CAST(null as bit) selected,* INTO # FROM employee '+
               'SELECT * FROM #';
       Adoquery1.Close;
       Adoquery1.SQL.Clear;
       Adoquery1.SQL.Add(strSql);
       Adoquery1.Open;
       List:=TStringList.Create ;end;procedure TForm2.BitBtn1Click(Sender: TObject);
       Var
          strSql:String;
          gh:String;
          intI:Integer;
    begin
       gh:='';
       For intI:=List.Count -1 Downto 0 Do
          gh:=gh+list[intI]+',';
       strSql:='SELECT * FROM employee WHERE charindex(gh,'''+gh+''')>0 ';end;end.