主题:
解决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;