首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.Object和System.EventArgs

System.Object和System.EventArgs
EN

Stack Overflow用户
提问于 2018-08-16 22:47:32
回答 2查看 533关注 0票数 0

我试着写一个简单的日历来选择日期。我有一个PushButtons数组,现在我尝试以编程方式添加事件处理程序。

代码语言:javascript
复制
Public Sub Initialize()

    If EventID = 0 Then
        GetEmployeeData
        EventType = "Attendance"
    Else
        GetEventData
    End If

    Dim Days
    Days = Array(Sunday0, Monday0, Tuesday0, Wednesday0, Thursday0, Friday0, Saturday0, _
    Sunday1, Monday1, Tuesday1, Wednesday1, Thursday1, Friday1, Saturday1, _
    Sunday2, Monday2, Tuesday2, Wednesday2, Thursday2, Friday2, Saturday2, _
    Sunday3, Monday3, Tuesday3, Wednesday3, Thursday3, Friday3, Saturday3, _
    Sunday4, Monday4, Tuesday4, Wednesday4, Thursday4, Friday4, Saturday4, _
    Sunday5, Monday5, Tuesday5, Wednesday5, Thursday5, Friday5, Saturday5)

    Dim j As Long
    For j = 0 To 41
        AddHandler Days(j).Click, AddressOf Calendar_Click
    Next j
End Sub

Public Sub Calendar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim CalendarDay As Integer
    CalendarDay = Convert.Int32(sender.Caption)
    MsgBox (CalendarDay)
End Sub

但是,当我试图运行该表单时,会收到一条错误消息:

编译错误:用户定义类型未定义.

更新

我将事件处理程序签名更改为:

代码语言:javascript
复制
Public Sub Calendar_Click(ByVal sender As Object)

但是现在我得到了以下错误:

编译错误:使用AddressOf操作符无效

EN

回答 2

Stack Overflow用户

发布于 2018-08-17 11:51:18

您当然可以在Access中使用动态事件处理程序。但是每个对象都需要有自己的事件处理程序。

您可以为每个按钮使用一个单独的类,也可以使用一个类来管理按钮和事件。

您可以使用以下代码:

clsCalendar (创建事件处理程序并接收回事件的类)

代码语言:javascript
复制
Dim collButtonHandlers As Collection
Public Sub Initialize()
    Dim Days
    Days = Array(Sunday0, Monday0, Tuesday0, Wednesday0, Thursday0, Friday0, Saturday0, _
    Sunday1, Monday1, Tuesday1, Wednesday1, Thursday1, Friday1, Saturday1, _
    Sunday2, Monday2, Tuesday2, Wednesday2, Thursday2, Friday2, Saturday2, _
    Sunday3, Monday3, Tuesday3, Wednesday3, Thursday3, Friday3, Saturday3, _
    Sunday4, Monday4, Tuesday4, Wednesday4, Thursday4, Friday4, Saturday4, _
    Sunday5, Monday5, Tuesday5, Wednesday5, Thursday5, Friday5, Saturday5)
    'I assume that array is now filled with command buttons
    'Consider taking the array as input from a form
    Dim j As Long
    For j = 0 To 41
        AddButtonHandler Days(j)
    Next j
End Sub

Public Sub AddButtonHandler(btn As Access.CommandButton)
    Dim ButtonHandler As New clsCalendarButtonHandler
    ButtonHandler.Initialize btn, Me
    collButtonHandlers.Add ButtonHandler
End Sub

Public Sub Calendar_Click(btn As Access.CommandButton)
    Dim CalendarDay As Integer
    CalendarDay = CLng(btn.Caption)
    MsgBox (CalendarDay)
End Sub

clsCalendarButtonHandler (管理单个按钮事件并将其传递给管理类的类):

代码语言:javascript
复制
Dim cCalendar As clsCalendar
Dim btn As Access.CommandButton
Public Sub Initialize(cmdBtn As Access.CommandButton, Calendar As clsCalendar)
    Set cCalendar = Calendar
    Set btn = cmdBtn
    btn.OnClick = "[Event Procedure]"
End Sub

Private Sub btn_Click()
    cCalendar.Calendar_Click(btn)
End Sub
票数 1
EN

Stack Overflow用户

发布于 2018-08-17 04:38:04

这在2016年是不可能的。处理程序存在于VB.Net中,而不在Access VBA中。我只能想到这样的事情。但如果这是另一个有意义的问题:

代码语言:javascript
复制
Public Sub MyEventSelection(Day As String)

  Select Case Day

    Case "Sunday0"
      Call Sunday0()
    Case "Monday0"
      Call Monday0()

    'And so on...

  End Select

End Sub

Public Sub Sunday0()
  'Do Stuff
End Sub

Public Sub Monday0()
  'Do Stuff
End Sub

也许你应该重新考虑你需要的代码。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51886276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档