用 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.请指点!谢谢!
用下面的语句可以创建一个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.请指点!谢谢!
InternalCalc。不要在SQL語句中產生該字段。
-----
问题复杂化了,就不能多加几个ClientDataSet这个吗?
能详细说一下’增加一永久型Boolean字段即可‘?
=============================
先增加一永久型Boolean字段,程序运行后再给CommandText值,那么程序运行后ClientDataSet1中就只有一个永久型的Boolean字段,没有表的真正字段。
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;