rbn*_*per 0 delphi controls editing dataset tdbgrid
在 embarcadero docwiki 中,它说:
在除 TDBGrid 之外的所有数据控件中,当您修改字段时,当您从控件中按 Tab 键时,修改将复制到基础数据集。如果在从字段中使用 Tab 键之前按 Esc 键,数据控件将放弃修改,并且该字段的值将恢复为进行任何修改之前的值。在 Vcl.DBGrids.TDBGrid 中,当您移动到不同的记录时会发布修改
我正在使用 TDBGrid(以及其他数据控件),我发现他的更新行为非常不自然。我希望在用户点击“ENTER”时进行更新,而不仅仅是当用户“移动到不同的记录”或“控件中的 Tab”时。
我的问题是我怎么能改变这个?有任何想法吗?
先感谢您。
我认为您可能会混淆两件事,即更改从 DB-aware 控件(例如 TDBEdits)转发回数据集的相应数据集 TFields 对象,以及字段值的更改从字段回发到数据集的数据库数据。
这就是为什么我在评论中建议您应该在表单中添加 TDBNavigator 的部分原因。连接到与您的数据库感知控件相同的数据源,当数据集进入编辑状态时,它将通过启用其保存和取消按钮来显示数据集的状态,就像用户更改其中一个的内容时发生的那样控件。顺便提一下,这种状态更改仅在 DataSource 的 AutoEdit 属性设置为 True 时才会发生(默认情况下是这样,因此很容易错过正在发生的事情,并且没有意识到您可以根据需要阻止它)。
TDBGrid 有点不同的原因如下:
它背后的 TDataSet 被设计成有一个逻辑游标,它可以从一个记录移动到另一个记录,但一次只能访问一个记录 - 关联的 TFields 包含游标当前所在记录的数据值。
因此,必须通过滚动数据集游标来填充 DBGrid。
通常,DataSet 处于 dsBrowse 状态(参见 OLH 中的 TDataSetState)。当它被告知滚动时,如果它的当前状态是 dsEdit 或 dsInsert(例如,由于 GUI 中的用户操作),它将对当前记录的任何更改发布回数据集,并恢复到 dsBrowse 状态,以便它可以滚动指示。
DBGrid 提供了对来自用户的 pov 的大量记录的 GUI 访问,这一事实并不令人高兴。因为,正如您所注意到的,用户可能会更改一条记录(通过在网格中进行就地编辑或通过 DBEdits 等)并立即移动到另一行。事实上,就在网格中就地编辑而言,您的最佳选择通常只是不允许它 - 因为否则用户可能会更改一个记录中的某些内容,然后意外或故意单击另一个网格行,该行发布前一行对数据集的更改,而不给用户取消它的机会。
IMO,您不应该将它留给 OnExit 处理程序、焦点更改事件等来对数据集进行操作 - 使用它们来防止用户关闭带有数据更改挂起和类似事情的表单是很好的,但您应该要求用户执行显式操作以确定是保存还是取消挂起的更改。不尝试直接对来自 OnExit 等的数据集进行操作的一个原因是,通常需要在 GUI 中对用户更改/添加的数据执行数据验证检查,而这本身可能需要更改焦点以指导用户通过任何必要的纠正措施。
| 归档时间: |
|
| 查看次数: |
1976 次 |
| 最近记录: |