2

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

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

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

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

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

我知道 TClientDataSet 有一个用于原始数据的数据属性和一个用于编辑数据的 Delta 属性。这两个带有数据的属性可以一次显示在一个 DBGrid 中并且仍然允许用户编辑数据吗?

我查看了 30 多种资源和演示应用程序,都避免了这个问题。这可以做到吗?

4

3 回答 3

3

好的...这个问题在没有太多反馈的情况下被查看了很多。我通过下载许多教程、演示应用程序并阅读多篇讨论这些控件使用的文章/帮助信息进行了一些研究。

最终结果:

  1. 这些控件通常有点错误。
  2. 在具体提到我的问题时,可以肯定地说控件不能执行我所描述的标准。

这是基于我查看的 30 多个演示应用程序、文章和教程,它们都没有描述在单个数据网格中同时显示原始数据和 Delta 数据。当然,您可以使用 Listbox 或 StringGrid 破解此结果(这就是我所做的),但这也表明该控件不能或不能用于提供此功能(可能的可能性很小)。

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

已回答的问题 [如果您可以用我想要查看的演示应用程序证明不同,我将删除它]。

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

于 2010-12-08T13:21:48.037 回答
1

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

您还可以使用计算字段来完成您想要的操作。例如,如果您有一个字符串字段Name,则将一个新的计算字符串字段添加到名为 的数据集OldName,其长度与名称相同。

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

if DataSet.State = dsEdit then
begin
  DataSet.FieldByName('OldName').Value := DataSet.FieldByName('Name').OldValue;
end
else
begin
  DataSet.FieldByName('OldName').Value := Null;
end;
于 2011-10-20T16:59:37.923 回答
0

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

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

于 2011-10-20T19:15:20.183 回答