代码之家  ›  专栏  ›  技术社区  ›  Forer

使用delphi中的clientdataset,您是否能够在dbgrid中同时显示数据和delta记录?

  •  2
  • Forer  · 技术社区  · 14 年前

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

    控制 : 1。DBGrid1链接到数据源1以直观显示数据。 2。datasource1链接到clientdataset1以提供数据供dbgrid显示。 三。clientdataset1链接到datasetprovider1以提供客户端数据进行编辑。 4。DataSetProvider1是链接的sqldataset1,它从单个DB表中选择记录。 5。sqldataset1链接到sqlconnection以提供到mysql数据库的连接。

    行动 : 1。用户插入记录:我使用clientdataset1.insertrecord; 2。用户删除一条记录:我使用clientdataset.delete; 三。用户提交数据:我使用clientdataset1.applyUpdates(-1);

    这一切在处理数据和发布数据方面都非常有效(在删除记录之前,在DataSetProvider1上包含一个小的黑客)。

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

    我知道tclientdataset有一个用于原始数据的数据属性和一个用于编辑数据的delta属性。这两个具有数据的属性是否可以同时显示在单个dbgrid中并允许用户编辑数据?

    我已经查看了30多个资源和演示应用程序,它们都避免了这个问题。能做到吗?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Forer    14 年前

    好的……这个问题已经被公平地看待了,没有太多的反馈。我下载了许多教程、演示应用程序并阅读了多篇文章/帮助信息,讨论了这些控件的使用。

    最终结果:

    1. 一般来说,这些控件有点麻烦。
    2. 在具体提到我的问题时,可以肯定地说,控制措施不能达到我所说的标准。

    这是基于我所回顾的30多个演示应用程序、文章和教程,它们要么没有描述在单个数据网格中用增量数据同时显示原始数据。当然,您可以使用列表框或StringGrid来破解这个结果(这正是我所做的),但这也表明控件不能或不能提供这个功能(可能性很小)。

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

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

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

        2
  •  0
  •   Marcus Adams    13 年前

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

    您还可以通过使用计算字段来完成所需的工作。例如,如果您有一个字符串字段 Name ,将新的计算字符串字段添加到名为 OldName ,长度与名称相同。

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

    if DataSet.State = dsEdit then
    begin
      DataSet.FieldByName('OldName').Value := DataSet.FieldByName('Name').OldValue;
    end
    else
    begin
      DataSet.FieldByName('OldName').Value := Null;
    end;
    
        3
  •  0
  •   user160694    13 年前

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

    InsertRecord可能会绕过某些通知机制,因此字段显示不会更新。如果执行simpy插入和设置字段值会怎么样?