0

在 embarcadero docwiki 中,它说:

在除 TDBGrid 之外的所有数据控件中,当您修改字段时,当您从控件中 Tab 时,修改将复制到基础数据集。如果在从字段中按 Tab 之前按 Esc,则数据控件会放弃修改,并且字段的值将恢复为在进行任何修改之前保持的值。在 Vcl.DBGrids.TDBGrid 中,当您移动到不同的记录时会发布修改

我正在使用 TDBGrid(以及其他数据控件),我发现他的更新行为非常不自然。我希望当用户点击“ENTER”时进行更新,而不仅仅是当用户“移动到不同的记录”或“来自控件的选项卡”时。

我的问题是我怎么能改变这个?有任何想法吗?

先感谢您。

4

2 回答 2

5

我认为您可能会混淆两件事,即从 DB 感知控件(例如 TDBEdits)转发回数据集的相应数据集 TFields 对象的更改,以及从字段回发回数据集数据库数据的字段值的更改。

这就是为什么我在评论中建议您应该在表单中添加一个 TDBNavigator 的部分原因。连接到与 DB 感知控件相同的 DataSource,当 DataSet 进入编辑状态时,它将通过启用其 Save 和 Cancel 按钮来显示 DataSet 的状态,就像用户更改其中一个的内容时一样控制。顺便说一句,这种状态更改仅在 DataSource 的 AutoEdit 属性设置为 True 时发生(默认情况下,因此很容易错过正在发生的事情,并且没有意识到如果需要可以阻止它)。

TDBGrid 有点不同的原因如下:

  • 它背后的 TDataSet 设计为具有一个逻辑游标,该游标可以在记录之间移动,但一次只能访问一条记录 - 关联的 TField 包含游标当前所在记录的数据值。

  • 因此,必须通过滚动数据集光标来填充 DBGrid。

  • 通常,DataSet 处于 dsBrowse 状态(参见 OLH 中的 TDataSetState)。当它被告知滚动时,如果它的当前状态是 dsEdit 或 dsInsert(例如,由于 GUI 中的用户操作),它会将对当前记录的任何更改发送回数据集,并恢复到 dsBrowse 状态,以便它可以滚动指示。

  • 这种后滚动前的行为并不令人高兴,因为 DBGrid 提供了对来自用户 pov 的“同时”的许多记录的 GUI 访问。因为,正如您所注意到的,用户可能会更改一条记录(通过在网格中进行就地编辑或通过 DBEdits 等)并立即移动到另一行。事实上,就在网格中就地编辑而言,您最好的选择通常是不允许它 - 因为否则用户可能会更改一条记录中的某些内容,然后意外或故意单击另一个网格行,该行会发布数据集上一行的更改,而不给用户机会取消它。

IMO,您不应该将其留给 OnExit 处理程序、焦点更改事件等来对数据集进行操作 - 可以使用它们来防止用户在数据更改未决和类似情况下关闭表单,但您应该要求用户执行明确的操作来确定是保存还是取消挂起的更改。不尝试直接从 OnExit 等对数据集进行操作的一个原因是,通常需要在 GUI 中对用户更改/添加的数据执行数据验证检查,并且这本身可能需要更改焦点以引导用户通过任何必要的纠正措施。

于 2014-12-10T12:35:25.543 回答
1

向网格的 OnExit 添加 Post 语句?

我也总是在我的 OnFormCloseQuery 事件中放置一系列 Post 语句。

于 2014-12-10T12:30:55.497 回答