2

在OnDirty事件 (MS Access 2007) 中如何判断表单是否脏?

考虑这个简单的例子,我正在调用一个子例程来验证Form_Dirty()事件中的一些按钮。

Private Sub Form_Dirty(Cancel As Integer)
    MsgBox Me.Dirty  
    ' The above line shows false, which makes the Me.Dirty property about as useful as tits on a bull!
    Call validateSaveCancelBtn
End Sub   

Private Sub validateSaveCancelBtn()
    btnCancel.ENABLED = Me.Dirty
    btnSave.ENABLED = Me.Dirty
End Sub

请不要告诉我只是将validateSaveCancelBtn()中的代码粘贴到Form_Dirty()中并在那里硬编码。这对我来说不起作用,因为我也从其他地方调用了 validateSaveCancelBtn() ,实际逻辑比我在这里粘贴的更复杂。

4

1 回答 1

4

假设你的表单是一个绑定表单,在表单的 Dirty 事件中表单绝对是脏的,尽管此时 Me.Dirty 属性仍然是假的。

以下是您如何解决这个奇怪的问题。

Private Sub Form_Dirty(Cancel As Integer)
    Call validateSaveCancelBtn(True)
End Sub 

Public Sub validateSaveCancelBtn(bDirty as Boolean)
    btnCancel.Enabled = bDirty
    btnSave.Enabled = bDirty
End Sub

在您调用 validateSaveCancelBtn 的其他任何地方,只需使用以下命令:

Private Sub Form_AfterUpdate()
    Call validateSaveCancelBtn(Me.Dirty)
End Sub

纯粹作为旁注

我尽量避免在 Save/New/Cancel/Delete 按钮上使用 Visible 和 Enabled 属性。我发现对每个按钮背后的代码进行编程会更加万无一失,这样它就可以针对每种可能的情况以不同的方式(并且正确地)处理按钮按下。

确实,如果这些按钮始终可见并启用,则用户的反馈会减少,即使没有任何内容可保存或取消,看起来您也可以保存或取消。话虽如此,请考虑 Access 中的保存和取消按钮基本上是开箱即用的。原因如下:

  1. 当用户关闭表单时,将保存新记录或对记录的更改
  2. 当用户移动到子表单时,将保存新记录或对记录的更改
  3. 由于#2,一旦用户移动到子窗体,取消按钮将无法取消主窗体上的更改。主窗体上的取消按钮也不能取消对子窗体上的记录所做的更改,因为一旦焦点成功地从子窗体转移回主窗体,子窗体记录就已保存。

我通常会显示一个保存按钮并使其始终可见并启用。让用户点击感觉很好,提供按钮也没有坏处。我实际上也将代码放在它后面,但我不强迫用户使用保存按钮,因为还有其他事件(如前所述)会导致 Save 被触发。

I generally do not provide Cancel buttons because they are "broken" just as soon as you add a subform. I've been involved in numerous discussions about how to provide the user with a Cancel button that can cancel multi-record edits (basically, handle a form and subforms as a transaction). Probably one of the best methods, though still very involving to build, is to use Temporary Tables (basically pseudo-temporary tables, as Access doesn't actually have anything officially called a temporary table) to hold the records being added/edited. Then on the Save Button or on Form Close you have to actually write those records back to the real database. There's much more to it than that, but I'm just trying to give you a rough idea.

于 2012-07-02T14:10:22.097 回答