版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41660162/article/details/81448495
主题:
解决clientdataset 自定义字段无法在前台修改值的问题;数据库里面直接取的字段从前台可以修改,但是自定义的返回字段无法修改。
报错信息:
- error1:EDatabaseError with message ‘Field ‘选择’ cannot be modified
- 如果仅仅修改cdsA.field[0].ReadOnly=false,在Post的时候会报error2:EDBClient with message ‘Trying to modify read-only field
解决思路:
将一个复制Data的clientdataset做成可写。因为直接赋值cdsA.data=cdsTemp.data会连着datasetprovider的一些东西一起赋值,readonly属性也会赋值
解决方法:
只需要将需要修改但不能修改的clientdataset,传入到此方法之后,即可修改其的字段值。
{
Author:mxd
time:2018.08.03 16:57:43
function:解决clientdataset 连接脱离框架导致自定义字段无法在前台修改值的问题
description:将一个复制Data的clientdataset做成可写。因为直接赋值cdsA.data=cdsTemp.data会连着datasetprovider的一些东西一起赋值,readonly属性也会赋值
error1:EDatabaseError with message 'Field '选择' cannot be modified
如果仅仅修改cdsA.field[0].ReadOnly=false,在Post的时候回报error2
error2:EDBClient with message 'Trying to modify read-only field
}
procedure TDM.SetDstAllFieldCanEdit(cdsA: TClientDataSet);
var cdsB:TClientDataSet;
I:Integer;
begin
cdsB := TClientDataSet.Create(nil);
Try
cdsA.DisableControls;
cdsB.Data := cdsA.Data;
cdsA.Close;
cdsA.FieldDefs.Clear;
for I:=0 to cdsB.FieldDefs.Count - 1 do
begin
with cdsA.FieldDefs.AddFieldDef do
begin
DataType := cdsB.FieldDefs[I].DataType;
Size := cdsB.FieldDefs[I].Size;
Name := cdsB.FieldDefs[I].Name;
end;
end;
cdsA.CreateDataSet;
with cdsB do
begin
First;
while not Eof do
begin
cdsA.Append;
for I := 0 to Fields.Count - 1 do
cdsA.Fields[I].Value := Fields[I].Value;
Next;
end;
end;
if cdsA.State in [dsInsert,dsEdit] then cdsA.Post;
cdsA.MergeChangeLog;
Finally
cdsA.EnableControls;
cdsB.Free;
End;
end;