使用Delphi中的ClientDataSet,您是否能够同时显示数据和;DBGrid中的增量记录?

使用Delphi中的ClientDataSet,您是否能够同时显示数据和;DBGrid中的增量记录?,delphi,dataset,dataprovider,dbgrid,Delphi,Dataset,Dataprovider,Dbgrid,我正在使用标准的数据感知组件和dbExpress在Delphi6+MySQL数据库中制作一个应用程序。该应用程序允许用户在网格中查看记录,并在客户端编辑数据(插入和/或删除记录)。然后,这些数据编辑仅在单击“提交”按钮时写入数据库。所有这些都可以正常工作,并具有以下设置: 控件: 1.DBGrid1链接到数据源1以直观地显示数据。 2.DataSource1链接到ClientDataSet1,以提供DBGrid要显示的数据。 3.ClientDataSet1链接到DataSetProvider1

我正在使用标准的数据感知组件和dbExpress在Delphi6+MySQL数据库中制作一个应用程序。该应用程序允许用户在网格中查看记录,并在客户端编辑数据(插入和/或删除记录)。然后,这些数据编辑仅在单击“提交”按钮时写入数据库。所有这些都可以正常工作,并具有以下设置:

控件: 1.DBGrid1链接到数据源1以直观地显示数据。 2.DataSource1链接到ClientDataSet1,以提供DBGrid要显示的数据。 3.ClientDataSet1链接到DataSetProvider1,以提供客户端数据进行编辑。 4.DataSetProvider1链接到SQLDataSet1,它从单个DB表中选择记录。 5.SQLDataSet1链接到SQLConnection以提供到MySQL数据库的连接

行动: 1.用户插入一条记录:我使用ClientDataSet1.InsertRecord; 2.用户删除记录:我使用ClientDataSet.Delete; 3.用户提交数据:我使用ClientDataSet1.ApplyUpdate(-1)

这一切在处理数据和发布数据方面都非常有效(包括DataSetProvider1BeforeUpdateRecord删除记录之前的一些小技巧)

现在我的问题: 当用户第一次加载表单时,DBGrid1将显示所有原始记录,并删除所有已删除的记录。但当用户在ClientDataSet1中插入新记录时,DBGrid1中会显示一条空白记录。实际数据不会丢失或设置为空,因为在ClientDataSet1.ApplyUpdate中,此记录会正确写入数据库

我知道TClientDataSet具有原始数据的数据属性和编辑数据的增量属性。这两个属性是否可以同时在单个DBGrid中显示数据,并且仍然允许用户编辑数据


我已经看过30多个资源和演示应用&所有这些都避免了这个问题。这可以做到吗?

好的……这个问题被认为是一个相当多的问题,没有太多的反馈。我下载了许多教程、演示应用程序并阅读了多篇讨论这些控件使用的文章/帮助信息,进行了一些研究

最终结果是:

  • 这些控件通常有点问题
  • 在具体提到我的问题时,可以肯定地说,这些控件无法实现我所描述的标准 这是基于我回顾的30多个演示应用程序、文章和教程,它们要么没有描述在单个数据网格中同时显示原始数据和增量数据。当然,您可以使用Listbox或StringGrid来破解这个结果(我就是这么做的),但这也表明该控件无法或无法提供此功能(可能性很小)

    在我看来,这个功能是一个明显的疏忽,因为用户希望在单个数据网格中方便地看到其操作的潜在结果,而开发人员希望以简单、无痛苦的方式提供,即使用数据网格显示数据

    回答的问题[如果你能用我想回顾的演示应用程序证明不同,我会删除这个]


    如果您创建了一个演示应用程序,但无法使其正常工作,请投票表决我的答案。谢谢

    Delphi提供的TDBGrid控件没有显示字段新旧值的内置功能。当然,欢迎您从网格继承,或者创建自己的网格并添加功能,或者购买第三方组件来实现您想要的功能。您不局限于标准控件,尽管它们提供了最常用的功能

    您还可以通过使用计算字段来完成所需的操作。例如,如果您有一个字符串字段
    Name
    ,请向名为
    OldName
    的数据集中添加一个新的计算字符串字段,其长度与Name相同

    然后在数据集的OnCalcFields事件中,只需输入如下代码:

    if DataSet.State = dsEdit then
    begin
      DataSet.FieldByName('OldName').Value := DataSet.FieldByName('Name').OldValue;
    end
    else
    begin
      DataSet.FieldByName('OldName').Value := Null;
    end;
    

    TClientDataset将自行处理正确的记录状态。将记录更改,但除非您明确要求它显示某些其他状态(请参见StatusFilter属性),否则它将显示记录的实际状态


    InsertRecord可能会绕过某些通知机制,因此不会更新字段显示。如果执行简单的插入操作并设置字段值,该怎么办?

    为什么插入新记录时出现空白记录的问题?这不是你填写的空白记录吗?不。我运行ClientDataSet1.InsertRecord([字段值数组]);InsertRecord先执行Insert,然后执行Post事件。完成此操作后,DBGrid将显示一条不可编辑的空白记录。我执行ApplyUpdate以提交给DB,然后查询DB表,新插入的记录就在那里。问题是DBGrid没有在新插入的记录中显示字段值。请检查我的答案。@Idsandon:是的,它是旧的。所有开发人员都需要使用可用的或提供给项目的工具(有时是旧的,有时是最先进的)。解决方案不仅仅是更新(这意味着钱,而且往往会带来其他问题)。因此,版本的年代对我的项目获得解决方案并不重要,但会帮助其他人理解问题的背景。谢谢您的输入是的,但是在这样的版本上也很难提供帮助,因为大多数人都转移到了以后的版本。您是否也应用了所有可用的更新包?Delphi6发布时有点问题,我听说了。但D6就是这样,并且已经有了更新。这些控件只是有缺陷的,或者更确切地说是一项正在进行的工作。即使升级到D7或更高版本,也意味着应用程序上的许多变化肯定会很快被“放下”。希望如此。如果没有测试,我不确定这是否有效。我的直觉是不会,因为我使用的是TClientDataSet,它有两种存储数据的“模式”:实际记录状态(数据库中存在的数据)和日志状态(clientdataset中更改的数据)。这些不能显示在侧面