退出表单前访问必填字段

Posted

技术标签:

【中文标题】退出表单前访问必填字段【英文标题】:Access Required Fields Before Exiting Form 【发布时间】:2017-05-19 16:51:10 【问题描述】:

我有这个更新前代码来检查是否填写了某些字段。这些字段是必需的,必须填写,否则记录不应保存。如果其他字段没有填写 ID 和 Staff 字段,则弹出消息框提示(这些是必填字段等)。

Private Sub Form_BeforeUpdate(Cancel As Integer)

If Nz([ID], "") = "" Then
    MsgBox "The ID field is required.", vbExclamation, "Required Field"
    Cancel = True
End If
If Nz([Staff], "") = "" Then
    MsgBox "Staff field is required.", vbExclamation, "Required Field"
    Cancel = True
    Me.[Staff].SetFocus
End Sub

我有一个“关闭表单”按钮,如下所示:

Private Sub CmdCloseForm_Click()
    DoCmd.Close , ""
End Sub

单击此按钮时,我收到未填写字段的警告,但随后表单关闭。我想要一个是/否消息框,询问用户是否仍想关闭表单。我在 BeforeUpdate 子中创建了一个是/否消息框。但是它不会停止子 CmdCloseForm。

有没有办法创建一个消息框来确认用户是否要退出表单?

例如:

If MsgBox("Would you like to close the form still? Changes won't be saved.", vbYesNo + vbQuestion, "Warning") = vbNo Then
    Exit Sub
End If

如果我将上面的 Msgbox 放入 CmdCloseForm 函数中,它会在让用户知道他们缺少 ID/Staff 字段之前提示用户。

【问题讨论】:

也许你应该在按钮点击事件中进行数据验证。 【参考方案1】:

我是由 Craig Dolphin 先生提出的这个解决方案,它对我有用。 他的方法是在通用模块中保存一个通用的验证函数(即不在表单模块中)。

Public Function validateform(myform As Form) As Boolean
'returns true if all required fields have data, or false if not. 
'It will also create a popup message explaining which fields need data

Dim boolresponse As Boolean
Dim strError As Variant
Dim ctl As Control
boolresponse = True
strError = Null
With myform
For Each ctl In .Controls
  With ctl
    If .Tag = "required" Then
       If .Value & "" = "" Then
            boolresponse = False
            strError = (strError + ", ") & .Name
        End If
    End If
  End With
Next ctl
End With
If strError & "" <> "" Then MsgBox "The following information must be entered first: " 
& strError, vbInformation
validateform = boolresponse
End Function

然后,对于任何绝对需要的字段,您只需将控件的 Tag 属性设置为 'required'

然后,例如,您可以从“保存”按钮或“关闭”按钮的 onclick 事件调用该函数。

Private Sub Command5_Click()
On Error GoTo Err_Command5_Click


If Me.PrimaryID & "" <> "" Then
If validateform(Me) Then DoCmd.Close
Else
DoCmd.Close
End If

Exit_Command5_Click:
Exit Sub

Err_Command5_Click:
MsgBox Err.Description
Resume Exit_Command5_Click

End Sub

这实质上是检查 auto pk 字段是否具有指示记录已创建的值。如果有,则验证必填字段。如果没有,它会在不检查的情况下关闭。如果记录已创建,则验证表单并仅在填写所有必填字段后关闭。如果需要更多数据,则会弹出一条消息,提醒用户填写哪些字段。

这样做的好处是,如果另一个字段更新为您想要触发附加要求的值,您可以使用 vba 设置条件要求,将某些控件的标记属性设置为必需。当然,如果您这样做,那么您还需要在 on_current 事件中初始化这些标记值,以便在切换记录时使用。 非常感谢 Craig Dolphin 先生

【讨论】:

【参考方案2】:

由于您想显示连续的弹出窗口,请完全取消自动更新并在关闭时验证。

如果验证成功则保存记录,如果不通知用户。

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Cancel = True  'cancel auto-update
End Sub

'Validate and either Save or Close
Private Sub CmdCloseForm_Click()
    If Me.Dirty Then
        If IsFormValidated Then
            DoCmd.RunCommand acCmdSaveRecord
        Else
            If MsgBox("Would you like to close the form still? Changes won't be saved.", vbYesNo + vbQuestion, "Warning") = vbNo Then Exit Sub
        End If
    End If
    DoCmd.Close acForm, Me.Name, acSavePrompt
End Sub

'Validation
Private Function IsFormValidated() As Boolean

    IsFormValidated = True  'assume all is in order

    If Nz([ID], "") = "" Then
        MsgBox "The ID field is required.", vbExclamation, "Required Field"
        IsFormValidated = False
    End If

    If Nz([Staff], "") = "" Then
        MsgBox "Staff field is required.", vbExclamation, "Required Field"
        Me.[Staff].SetFocus
        IsFormValidated = False
    End If
End Function

【讨论】:

感谢您。我曾尝试过类似的方法,但问题仍然是我会有 Y/N 消息框(“您要关闭吗?”),然后提示:“人员字段丢失。” “缺少 ID 字段。”我想要一种按以下顺序显示消息框的方法: 1. 缺少人员字段。 2. 缺少 ID 字段。 3. 是否仍要关闭此表单? 另外,我刚刚尝试了您写的内容,效果很好,我只是想找出一种方法来制作“您要关闭此表单吗?”最后一个消息框。

以上是关于退出表单前访问必填字段的主要内容,如果未能解决你的问题,请参考以下文章

winform 窗体退出前判断表单是不是修改过,窗体上的控件有很多个,TextBox,combox,datagridview

VUE项目实战12登录与退出功能-请求登录

token测试的测试点

PHP 表单验证 - 必填字段

循环遍历表单,关注必填(但无效)字段

表单提交而不检查ext js中的必填字段