在Delphi控件中编辑数据并更新其基础数据集

在Delphi控件中编辑数据并更新其基础数据集,delphi,dataset,controls,editing,tdbgrid,Delphi,Dataset,Controls,Editing,Tdbgrid,在embarcadero docwiki中,它说: 在除TDBGrid之外的所有数据控件中,当您修改字段时,当您从控件中进行制表时,修改将复制到基础数据集。如果在从字段中选择制表符之前按Esc键,则数据控件将放弃修改,并且该字段的值将恢复为进行任何修改之前保留的值。 在Vcl.DBGrids.TDBGrid中,当您移动到另一个记录时,将发布修改 我正在使用TDBGrid(以及其他数据控件),我发现他的更新行为非常不自然。我希望在用户点击“回车”时进行更新,而不仅仅是在用户“移动到另一条记录”或“

在embarcadero docwiki中,它说:

在除TDBGrid之外的所有数据控件中,当您修改字段时,当您从控件中进行制表时,修改将复制到基础数据集。如果在从字段中选择制表符之前按Esc键,则数据控件将放弃修改,并且该字段的值将恢复为进行任何修改之前保留的值。 在Vcl.DBGrids.TDBGrid中,当您移动到另一个记录时,将发布修改

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

我的问题是我怎样才能改变这一点?有什么想法吗


提前感谢。

在网格的OnExit中添加一条Post语句


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

是否将Post语句添加到网格的OnExit


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

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

这就是为什么我在评论中建议在表单中添加TDBNavigator的部分原因。连接到与DB aware控件相同的数据源时,当数据集处于编辑状态时,它将通过启用其保存和取消按钮来显示数据集的状态,就像用户更改其中一个控件的内容时发生的情况一样。顺便说一句,只有当数据源的AutoEdit属性设置为True时才会发生这种状态更改(默认情况下为True,因此很容易忽略正在发生的事情,并且没有意识到如果需要可以阻止它)

TDBGrid稍有不同的原因如下:

  • 它后面的TDataSet设计为具有一个逻辑游标,该游标可以从一个记录移动到另一个记录,但一次只能访问一个记录—关联的TField包含游标当前所在记录的数据值

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

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

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


在我看来,对数据集执行操作不应该让OnExit处理程序、焦点更改事件等来完成——可以使用它们来防止用户关闭带有挂起的数据更改和类似内容的表单,但应该要求用户执行显式操作,以确定是保存还是取消挂起的更改。不尝试从OnExit等直接对数据集执行操作的一个原因是,通常需要在GUI中对用户更改/添加的数据执行数据验证检查,而这本身可能需要更改焦点以指导用户执行任何必要的纠正操作。

我想您可能混淆了两件事,即,从DB感知控件(如TDBEdits)中继回数据集的相应数据集TFields对象的更改,以及从字段发回数据集数据库数据的字段值更改

这就是为什么我在评论中建议在表单中添加TDBNavigator的部分原因。连接到与DB aware控件相同的数据源时,当数据集处于编辑状态时,它将通过启用其保存和取消按钮来显示数据集的状态,就像用户更改其中一个控件的内容时发生的情况一样。顺便说一句,只有当数据源的AutoEdit属性设置为True时才会发生这种状态更改(默认情况下为True,因此很容易忽略正在发生的事情,并且没有意识到如果需要可以阻止它)

TDBGrid稍有不同的原因如下:

  • 它后面的TDataSet设计为具有一个逻辑游标,该游标可以从一个记录移动到另一个记录,但一次只能访问一个记录—关联的TField包含游标当前所在记录的数据值

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

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

  • 这篇文章在滚动之前的行为不符合v。令人高兴的是,DBGrid为GUI提供了从用户pov“同时”访问大量记录的功能。因为,正如您所注意到的,用户可能会更改一条记录(通过在