访问 VBA - 触发组合框更改事件

Access VBA - Trigger combobox change event

一直在研究表单设计,现在我构建了一个表单,几乎完成了,只剩下一个问题。先解释一下:

表单绑定到 "Join Table",它只有 2 个字段 - 来自 "Table1" 的 ID 和来自 "Table2" 的 ID。基于这两个字段,我在同一表单上添加了来自 "Table1" 和 "Table2" 的字段。然后我添加了 2 个选项按钮,1 个组合框和 2 个子表单。

这使我可以从每个角度("Table1" 或 "Table2" 视图)观察连接的两个不同表中的记录。我 select 使用选项按钮编辑此视图,这会更改组合框行源,因此您可以从组合框导航到记录。

这是代码:

Private Sub OptButton0_Click()
        If Me.OptButtonO.Value = True Then

        Me.OptButton1.Value = False

       Me.Cmbox.RowSource = "SELECT [Table1].[Field1], [Table1].[Field2], [Table1].[Field3] FROM Table1 ORDER BY [Field1];"

      Me.Cmbox.SetFocus
      Me.Cmbox = Me.Cmbox.ItemData(0)

        End If

 End Sub

 Private Sub Cmbox_AfterUpdate()   
   If Me.OptButton0.Value = True Then

    If IsNull(Me!Cmbox) Then Exit Sub

    With Me.RecordsetClone
      .FindFirst "[Field1] = " & Me!Cmbox
      If Not .NoMatch Then
         If Me.Dirty Then Me.Dirty = False
         Me.MySubform.Width = 8280
         Me.MySubform.SourceObject = "MySubform"
         Me.Bookmark = .Bookmark
      Else
         Me.MySubform.Width = 8000
         Me.MySubform.SourceObject = ""
      End If

    End With

Me.Cmbox.SetFocus
DoCmd.Requery

End If

End Sub

此发布代码仅适用于一个选项按钮,第二个相同,只是相反。现在有什么问题?

问题是,当我通过组合框浏览记录时,单击第二个选项按钮进入另一个视图,然后 RETURN 进入同一视图,我的子表单结果与我单击另一个选项按钮时的结果相同,尽管Combobox listIndex 为 0。如果我 select 来自 Combobox 的 combobox Listindex,代码将再次运行。

所以基本上 - 我需要在单击选项按钮时触发组合框更改的代码。它在您单击组合框时有效,但在单击选项按钮时无效。

我知道理解起来比较复杂,请看代码,有什么问题请教。任何帮助表示赞赏。

在选项按钮点击事件中调用combobox afterupdate事件:

private sub optbutton0_click()
    ...
    cmbox_afterupdate()
end sub

PS:与其直接为选项按钮设置事件,不如将它们放在框架中(即使随后必须使框架透明以阻止它出现)并使用 afterupdate 或frame的点击事件,通过option值可以得到选中的option按钮:

private sub frame0_click()
    select case frame0
        case 0 'option button 0 is selected
            ...
        case 1 
        ...
    end select
end sub

在 Access 中,控件可以很有趣。我的意思是,当您更改选项时,您会看到它发生了变化,它在屏幕上发生了变化...但是控件并不总是立即更改其 .value...这意味着它不会 Update.为了更简单地说明这一原则,创建一个文本框,在其中键入一些内容,然后查看直接 window 中的 textbox.value。然后,在光标仍在文本框中的情况下,退格其中的一些内容。再次检查该值。多做几次。开始在测试中包含 textbox.text。有多种解决方法,但最重要的是了解控件实际更新的时间,这样您就可以更好地了解何时使用以及使用哪些解决方法。

现在,在这种情况下,您每次引用选择选项时都键入 'click'。我想我会支持你的。就个人而言,我有时会使用 Tab 和箭头键,这会是一个稍微复杂的答案,但是在理解了上面的文本框示例之后,你会更好地自己解决这个问题。但是,如果你把上面的 AfterUpdate 改成 Click,你应该就好了。

也就是说,除了鼠标点击之外还有一些事件可以激活Click事件。通常这不是问题,但由于您要更改表单的外观,特别是宽度,您可能需要注意在使用工具时子表单宽度有时可能会来回闪烁。不经常,可能不会太烦人,但我可能会重新考虑为什么我需要改变宽度,或者是否有更好的触发器。

另一种选择:我遇到了类似的问题:使用未绑定的组合框。在组合框中的“*_Change”事件中,如果我从下拉列表中选择一个值,该值就在那里;但是如果我删除现有值,之前的值仍然会显示。

...

If Me.series_filter > "" Then
    lstrMetric = lstrMetric & "and X.series_name = '" & Me.series_filter & "' "
End If

...

Me.Filter = Mid(lstrMetric, 5)

...

我在表单上有一个筛选器下拉列表:选择一个值是为了设置(或清除)筛选器。当我选择一个值时它有效,但如果我删除它就不清楚了。

我在代码的开头添加了一行以提交更新:

Me.dirty = false 

当清除组合框时,代码现在可以识别空值。这适用于我的情况 - 当然,如果您不想将任何更新的字段写入数据库,那将是一个问题。