zoukankan      html  css  js  c++  java
  • Delphi无法修改Clientdataset的字段的解决方法

    主题:

    解决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 

     

    解决思路:

    将一个复制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;
    好的代码像粥一样,都是用时间熬出来的
  • 相关阅读:
    (Java实现) 数塔问题
    (Java实现) 数塔问题
    Java实现 蓝桥杯VIP 算法训练 数的划分
    Java实现 蓝桥杯VIP 算法训练 数的划分
    (Java实现) 细胞
    理解ATL中的一些汇编代码(通过Thunk技术来调用类成员函数)
    一些常见的国际标准化组织
    Windows开发中一些常用的辅助工具
    如何分析程序的时间消耗
    C++代码覆盖率工具Coverage Validator
  • 原文地址:https://www.cnblogs.com/jijm123/p/13631842.html
Copyright © 2011-2022 走看看