用 ClientDataSet1->DataSource1->DBGridEh 建立的数据库软件,数据库用的SQL Server 2000,连接用的Socket,现在要在DBGridEh1的最前面增加一列CheckBox列,而这列数据仅仅是临时的,真正的表中根本没有这列数据,应怎么操作?谢谢!举例:如一个表中有10条记录,而我在其中五条记录的第一列打了“√”,那么现在要对这5条打“√”的记录操作(改变值)。  
用下面的语句可以创建一个TempCol的临时列(StudentNo,studentName,语文,数学,自然 为表中实际列),但该列修改后不能保存?
   //打开主表
  SQLStr1 := 'select cast(0 as int) as TempCol, StudentNo,studentName,语文,数学,自然 from student';
  CDSMaster.Active := False;
  CDSMaster.CommandText := SQLStr1;
  CDSMaster.Execute;
  CDSMaster.Active := True;  CDSMaster.FieldByName('TempCol').ReadOnly := False;
  CDSMaster.FieldDefs.Items[0].Attributes := CDSMaster.FieldDefs.Items[0].Attributes -[faReadonly];
  with DBGridEh1 do
  begin
    Columns[0].Checkboxes := True;
    Columns[0].KeyList.Clear;
    Columns[0].KeyList.Add('1');
    Columns[0].KeyList.Add('0');
    Columns[0].KeyList.Add('Null;-6;-5;-4;-3;-2;-1;2;3;4;5;6');
    Columns[0].AlwaysShowEditButton := True;
  end;运行后,可以在Check列上打勾,也可以取消勾,但不能保存,当把光标移动下一条记录时,提示:Trying to modify read-only field.请指点!谢谢!

解决方案 »

  1.   

    可以在ClientDataSet中自己定義一個字段,Field Property 的 Type 為 Boolean,Field Type 設為
    InternalCalc。不要在SQL語句中產生該字段。
      

  2.   

    非常感谢Freedom1010,WANGXUELLD:如果在ClientDataSet1里把CommandText先填好,然后在Fields Editor中新建InternalCalc 的 Boolean 字段,再把所有表中实际存在的字段添都添加进去,运行程序一点问题都没有。但是现在我的情况是CommandText是动态的,要在程序运行后给,如果先在Fields Editor中添加InternalCalc 的 Boolean 字段,程序运行后再给CommandText值,那么程序运行后就只有原来加的Boolean字段,没有表的真正字段,这时,表的字段怎样加到ClientDataSet1中?谢谢!  
      

  3.   

       但是现在我的情况是CommandText是动态的,要在程序运行后给,如果先在Fields   Editor中添加InternalCalc   的   Boolean   字段,程序运行后再给CommandText值,那么程序运行后就只有原来加的Boolean字段,没有表的真正字段,这时,表的字段怎样加到ClientDataSet1中?谢谢!     
    -----
    问题复杂化了,就不能多加几个ClientDataSet这个吗?
      

  4.   

    CommandText:不会这个处理的表都在变吗?如果是那样的情况,一个表需要一个ClientDataSet(我一般是这样做的),
      

  5.   

    to hsmserver 
       能详细说一下’增加一永久型Boolean字段即可‘?
      

  6.   

    to hsmserver:增加一永久型Boolean字段即可
    =============================
    先增加一永久型Boolean字段,程序运行后再给CommandText值,那么程序运行后ClientDataSet1中就只有一个永久型的Boolean字段,没有表的真正字段。
      

  7.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      i: Integer;
    begin
      with ClientDataSet1 do
      begin
        Close;
        Fields.Clear;
        FieldDefs.Clear;
        CommandText := SQLStr1;
        FieldDefs.Update;
        with TFieldDef(FieldDefs.Insert(0)) do
        begin
          Name := 'FIELD_NAME';
          DataType := ftBoolean;
          DisplayName := 'FIELD_NAME';
        end;
        for i := 0 to FieldDefs.Count - 1 do
          FieldDefs[i].CreateField(ClientDataSet1);
        Fields[0].FieldKind := fkInternalCalc;
        Open;
      end;
    end;procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
    begin
      with ClientDataSet1 do
      begin
        if Fields[0].Value = Null then Fields[0].AsBoolean := False;
      end;
    end;
      

  8.   

    非常感 Freedom1010 :问题已经解决,并且我向服务器保存数据也没有出现问题!困扰一周的问题终于解决!