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

时间:2016-04-02 17:19:13

标签: vba excel-vba access-vba ms-access-2010 excel

我一直在玩表单设计,现在我已经构建了一个几乎完整的表单,只留下一个问题。我先解释一下:

表单绑定到"加入表",它只有2个字段 - 来自"表1和#34;来自"表2和#34;的ID和。基于这两个字段,我添加了来自"表1和#34;的字段。 &安培; "表2和#34;,在同一表格上。然后我添加了2个选项按钮,1个Combobox和2个Subforms。

这使我能够从每个角度观察两个不同表格中的记录 - "表1和#34;或"表2"视图。我使用选项按钮选择此视图,这会更改Combobox rowsource,因此您可以导航到Combobox中的记录。

这是代码:

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

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

问题是当我通过Combobox浏览记录时,单击另一个视图的第二个选项按钮然后返回到同一视图,我的子窗体结果与我单击另一个选项按钮时保持相同,尽管Combobox listIndex为0。我从Combobox中选择了combobox Listindex,代码再次运行。

基本上 - 我需要在点击选项按钮时触发COMBOBOX更改的代码。当您在Combobox中单击时,它会起作用,但在单击“选项”按钮时则不行。

我知道理解起来很复杂,请查看代码并提出任何问题。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:2)

另一种选择:我有类似的问题:使用未绑定的组合框。在组合框中的'* _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 

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

答案 1 :(得分:1)

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

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

PS:不是直接为选项按钮设置事件,而是将它们放在一个框架中(即使你必须使框架透明以阻止其出现)并使用框架的后续更新或单击事件,您可以通过选项值获取所选的选项按钮:

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

答案 2 :(得分:0)

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

现在,在这种情况下,每次引用选择选项时都会键入“click”。我想我会抓住你。就个人而言,我有时使用textbox.text和箭头键,这将是一个稍微复杂的答案,但在理解了上面的文本框示例之后,您将更好地解决自己。但是,如果您将上面的Tab更改为AfterUpdate,那么您应该会感觉良好。

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