Delphi无法修改Clientdataset的字段的解决方法
主题:
解决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;
好的代码像粥一样,都是用时间熬出来的
分类:
Delphi
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)