主题:

解决clientdataset 自定义字段无法在前台修改值的问题;数据库里面直接取的字段从前台可以修改,但是自定义的返回字段无法修改。

报错信息:

  1. error1:EDatabaseError with message ‘Field ‘选择’ cannot be modified
  2. 如果仅仅修改cdsA.field[0].ReadOnly=false,在Post的时候会报error2:EDBClient with message ‘Trying to modify read-only field 

Delphi无法修改Clientdataset的字段的解决方法_解决方法

 

 Delphi无法修改Clientdataset的字段的解决方法_赋值_02

 

 

解决思路:

将一个复制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;