class - 创建一个类来处理 Access 表单控件事件

标签 class vba events ms-access commandbutton

我正在尝试创建一个类,它将处理 Access 中的多个控制事件。这是为了避免重复输入多行相同的代码。

我遵循了位于下一页的答案,但进行了一些调整以使其更适合 Access 而不是 Excel。

How to assign a common procedure for multiple buttons?

我的类(class)代码如下:

Option Compare Database

Public WithEvents ct As Access.CommandButton 'Changed object type to something recognised by Access

Public Sub ct_Click()
    MsgBox ct.Name & " clicked!"
End Sub

我的表单代码如下:
Option Compare Database
Private listenerCollection As New Collection
Private Sub Form_Load()
Dim ctItem
Dim listener As clListener

For Each ctItem In Me.Controls
    If ctItem.ControlType = acCommandButton Then 'Changed to test whether control is a Command Button
        Set listener = New clListener
        Set listener.ct = ctItem
        listenerCollection.Add listener
    End If
Next

End Sub

我在评论中注意到我对(工作)Excel 代码进行了更改。我认为问题出在类中的对象声明上。注意:在此过程中不会抛出任何错误;它根本不会触发事件。

提前致谢!

编辑:

我已经将问题缩小到“点击”事件中没有“[事件过程]”。如果我手动添加它,类会按预期工作。显然,我不想手动添加这些 - 它会破坏对象。任何想法我会怎么做?

最佳答案

在您的 OnLoad 事件中,您可以添加这一行

Dim ctItem
Dim listener As clListener

For Each ctItem In Me.Controls
    If ctItem.ControlType = acCommandButton Then 'Changed to test whether control is a Command Button
        Set listener = New clListener
        Set listener.ct = ctItem
        listener.ct.OnClick = "[Event Procedure]"  '<------- Assigned the event handler
        listenerCollection.Add listener
    End If
Next

尽管我不确定这是否比在设计器中双击 OnClick 并粘贴到方法调用中的代码更少。不管怎样都爽。

编辑:
你可以像这样改变你的类(class)
Public WithEvents ct As Access.CommandButton 'Changed object type to something recognised by Access

Public Function AddControl(ctrl as Access.CommandButton) as Access.CommandButton
    set ct = ctrl
    ct.OnClick = "[Event Procedure]"
    Set AddControl = ct
End Function

Public Sub ct_Click()
    MsgBox ct.Name & " clicked!"
End Sub

然后在您的表单中,您可以添加这样的 ct
For Each ctItem In Me.Controls
    If ctItem.ControlType = acCommandButton Then 'Changed to test whether control is a Command Button
        Set listener = New clListener
        listener.AddControl ctItem
        listenerCollection.Add listener
    End If
Next

现在事件处理程序被添加到类中。

关于class - 创建一个类来处理 Access 表单控件事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23522230/

相关文章:

vba - Excel VBA - 使用变量时 MkDir 返回 "Path not Found"

java - 在 Java GUI 中使一个方法触发另一个方法

java - java 中的 TicTacToe 游戏有问题吗?将 getText().equals() 与 jButtons 一起使用

class - 如何将 htmlpurifier 与 symfony2 集成?

c++ - 运行时创建的模板类的调用函数

css - 如何使用 SASS 定义 css 选择器类前缀

regex - 如何仅捕获匹配字符串的一部分?非捕获组

excel - VBA Excel - 以编程方式添加引用

ios - 如何使用 Google Calendar API iOS Swift 创建事件

javascript - jQuery 向事件发送参数