【问题标题】:Enable/Disable Fields with certain criteria MS Access启用/禁用具有特定条件的字段 MS Access
【发布时间】:2015-08-07 23:29:34
【问题描述】:

我正在尝试为保险索赔创建 MS Access 中的表单。我有所有需要填写的字段,但我希望能够根据用户的某些操作启用或禁用这些字段。所以表单的流程是这样的:我在顶部有一个带有两个单选按钮的框架,一个用于单索赔事件,一个用于多索赔事件。如果用户单击单一声明按钮,一切都会继续进行,没有问题。如果用户单击多索赔事件按钮,一个组合框会出现在侧面,其中包含他们需要从中选择的 MultiClaim_Incident_ID 编号的下拉列表。我想要做的是,如果用户选择了 Multi-Claim Incident 按钮并且没有从下拉列表中选择事件 ID 号(即,将其保留为默认值),那么表单的其余部分将被禁用,直到更正为以及清除所有字段...

它看起来应该很简单,但我似乎无法让它工作,我不确定我的逻辑是否有缺陷。这是我的 VBA 代码的删减版本:

Private Sub Form_Load()
    Me.SM_Frame.Value = 1
    Me.MultiClaim_Drpdwn.Value = Null
End Sub

Private Sub SM_Frame_AfterUpdate()
    If SM_Frame.Value = 1 Then
        Me.MultiClaim_Incident_ID_Label.Visible = False
        Me.MultiClaim_Drpdwn.Visible = False
    ElseIf SM_Frame.Value = 2 Then
        Me.MultiClaim_Incident_ID_Label.Visible = True
        Me.MultiClaim_Drpdwn.Visible = True
    ElseIf SM_Frame.Value = 2 & MultiClaim_Drpdwn.Value = Null Then
        Me.Incident_Date = Null
        Me.Incident_Date.Enabled = False
        Me.Claimant_Name.Value = ""
        Me.Claimant_Name.Enabled = False
    //PATTERN CONTINUES FOR REST OF FIELDS// 
        MsgBox ("CLEAR EVERYTHING!!")
    ElseIf SM_Frame.Value = 1 Then
        Me.Incident_Date.Value = ""
        Me.Incident_Date.Enabled = True
        Me.Claimant_Name.Value = ""
        Me.Claimant_Name.Enabled = True
    //PATTERN CONTINUES FOR REST OF FIELDS//
        MsgBox ("Everything can continue as is")
    End If
End Sub

【问题讨论】:

  • Condition1Condition2 都为 True 时,此表达式返回 True,或者当任一条件为 False 时返回 False:Condition1 And Condition2 此表达式将尝试将 Condition1 的等效字符串与 Condition2 的等效字符串连接:Condition1 & Condition2
  • 测试foo = Null 是否永远不会返回 True,无论 foo 的值如何。使用IsNull(foo) 检查 foo 是否为 Null。
  • 所以您是说使用与号进行逻辑比较而不是输入“And”?另外,要清除其中可能包含文本的文本框,Me.Incident_Date = Null 是正确的方法,还是更好的做法是 Me.Incident_Date = ""
  • 没有。使用And 进行逻辑比较。与号进行连接,而不是逻辑比较。

标签: vba ms-access ms-access-2013


【解决方案1】:

我只想说,让这样的序列正确并不简单!所以不要因为第一次尝试就没有做好而感到难过。我必须大约每月创建一次这样的东西,并且仍然需要大量尝试,直到它在所有情况下都有效。

尝试分离关注点:

您已经拥有SM_Frame_AfterUpdate()。在其中执行您必须处理从值 1 更改为 2 的操作,即使组合框可见,但停在那里。仅来自SM_Frame 的信息你不知道字段会发生什么,你需要等待MultiClaim_Drpdwn。另外,执行从 2 到 1 所需的操作,即隐藏 Combobox。

接下来,创建一个更新后处理程序MultiClaim_Drpdwn_AfterUpdate()。使用 THAT 根据其值处理字段(启用/禁用,设置为空)。

一旦你有了它,你就只剩下一些边缘情况了。例如,您希望字段在更改 SM_Frame 后立即表现得像 MultiClaim_Drpdwn_AfterUpdate() 状态。一旦你明白你可以很高兴地从SM_Frame_AfterUpdate() 内部打电话给MultiClaim_Drpdwn_AfterUpdate(),那就很容易了,最好在最后完成。这些事件处理程序仍然只是普通功能,已经公开并且可供任何人使用。当您来自单选按钮或不来自组合框时,这将使事情链很好。

【讨论】:

  • 这有很大帮助,通过将第二个 ElseIf 放入处理程序 MultiClaim_Drpdwn_AfterUpdate() 中,我能够禁用字段,但如果我更改了 MultiClaim_Drpdwn.Value 的值,则无法启用。我可能在这里过度,但我可以这样做:ElseIf SM_Frame.Value = 1 Or (SM_Frame.Value = 2 And Not IsNull(MultiClaim_Drpdown.Value))
【解决方案2】:

在“elseif”系列中,一旦条件为真,其余的将被忽略。

所以,你的

ElseIf SM_Frame.Value = 2 & MultiClaim_Drpdwn.Value = Null Then

永远不会到达,因为你已经得到了

ElseIf SM_Frame.Value = 2 Then

之前。

同样的想法,MsgBox 后面的“ElseIf SM_Frame.Value = 1 Then”完全没用,因为它被“If SM_Frame.Value = 1 Then”隐藏

尝试使用逐步调试模式来查看。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多