簡體   English   中英

VB.NET中的事件列表

[英]List(Of Event) in VB.NET

以下是一個較大項目的一部分,但是出於這個問題的目的,我有以下代碼:

Public MustInherit Class Class1(Of T As {System.Windows.Forms.Control, New})
Inherits System.Windows.Forms.UserControl

Friend Items As New Dictionary(Of Integer, T)

    Sub Add(ByRef Item As T, ByVal Index As Integer)
        Me.Items.Add(Index, Item)
        AddHandler Item.Click, AddressOf Class1Click
    End Sub

    Public Shadows Event Click(ByVal sender As System.Object, ByVal e As System.EventArgs, ByVal Index As Integer)

    Sub Class1Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        RaiseEvent Click(sender, e, DirectCast(sender, T).Index)
    End Sub

End Class

Public Class Class1CheckBox
    Inherits Class1(Of System.Windows.Forms.CheckBox)
End Class

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
    Inherits System.Windows.Forms.Form
    ...
    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.MyClass1 = New Class1CheckBox()
        Me.CheckBox1 = New System.Windows.Forms.CheckBox()
        Me.CheckBox2 = New System.Windows.Forms.CheckBox()
        Me.CheckBox3 = New System.Windows.Forms.CheckBox()
        Me.CheckBox4 = New System.Windows.Forms.CheckBox()
        Me.SuspendLayout()
        ...
        Me.CheckBox1.Name = "CheckBox1"
        Me.CheckBox2.Name = "CheckBox2"
        Me.CheckBox3.Name = "CheckBox3"
        Me.CheckBox4.Name = "CheckBox4"
        ...
    End Sub
    ...
    Friend WithEvents CheckBox1 As System.Windows.Forms.CheckBox
    Friend WithEvents CheckBox2 As System.Windows.Forms.CheckBox
    Friend WithEvents CheckBox3 As System.Windows.Forms.CheckBox
    Friend WithEvents CheckBox4 As System.Windows.Forms.CheckBox
    Friend WithEvents MyClass1 As Class1CheckBox

End Class

Public Class Form1
    Private Sub MyClass1_Click(ByVal sender As Object, ByVal e As System.EventArgs, ByVal Index As Integer) Handles MyClass1.Click
        MessageBox.Show(DirectCast(sender, CheckBox).Name)
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Controls.OfType(Of CheckBox).AsParallel.ForAll(Sub(n) Me.MyClass1.Add(n, n.Index))
    End Sub

End Class

上面的代碼很漂亮。 每當單擊四個復選框之一時,MyClass1會攔截該單擊甚至由MyClass1處理。 這就是我想要的。

問題是“點擊”是硬編碼的。 注意,Class1是通用的。 我希望它能夠接受任何繼承System.Windows.Forms.Control的類。 某些控件可能具有Check事件,懸停或GotFocus。 我需要的東西如下,我只是不確定正確的語法是什么:

Public Class Class1CheckBox
    Inherits Class1(Of System.Windows.Forms.CheckBox)
    MyBase.AddEvent("Hover", <signature>...)
End Class

Public MustInherit Class Class1(Of T As {System.Windows.Forms.Control, New})
    Inherits System.Windows.Forms.UserControl

    Friend Items As New Dictionary(Of Integer, T)
    Friend Events As New List(Of Event)

    Sub AddEvent(EventName As String, ...)
        Events.Add(EventName...)
    End Sub

    Sub Add(ByRef Item As T, ByVal Index As Integer)
        Me.Items.Add(Index, Item)
        For Each MyEvent As Event In Events
            AddHandler ...
        Next MyEvent
    End Sub

    'Public Shadows Event Click(ByVal sender As System.Object, ByVal e As System.EventArgs, ByVal Index As Integer)

    'Sub Class1Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    '    RaiseEvent Click(sender, e, DirectCast(sender, T).Index)
    'End Sub

End Class

創建某種事件序列的正確語法是什么,我將如何引發這些事件?

謝謝,

您想要的是不可能的。 事件是成員,就像方法和屬性一樣。 除非您知道擁有該成員的類型,否則您無法編寫代碼來訪問任何成員。

與方法和屬性一樣,如果要決定在運行時使用哪個事件,則必須使用Reflection。

就像jmcilhinney正確地說的那樣,您需要使用反射。

這是一個簡單的示例:

Imports System.Reflection

Public MustInherit Class Class1(Of T As {Control, New})

    Private _Items As New Dictionary(Of Integer, T)
    Private _Events As New Dictionary(Of String, [Event])

    Protected Sub AddEvent(eventName As String, [delegate] As [Delegate])
        If (Not Me._Events.ContainsKey(eventName)) Then
            Dim info As EventInfo = GetType(T).GetEvent(eventName)
            If (info Is Nothing) Then
                Throw New ArgumentOutOfRangeException("eventName")
            End If
            Me._Events.Add(eventName, New [Event]([delegate], info))
        End If
    End Sub

    Public Sub AddItem(item As T, index As Integer)
        Me._Items.Add(index, item)
        For Each [event] As KeyValuePair(Of String, [Event]) In Me._Events
            [event].Value.Info.AddEventHandler(item, [event].Value.Delegate)
        Next
    End Sub

    Friend Class [Event]
        Friend Sub New([Delegate] As [Delegate], Info As EventInfo)
            Me.[Delegate] = [Delegate]
            Me.Info = Info
        End Sub
        Public ReadOnly [Delegate] As [Delegate]
        Public ReadOnly Info As EventInfo
    End Class

End Class

Public Class Class1CheckBox
    Inherits Class1(Of CheckBox)

    Public Sub New()
        Me.AddEvent("CheckedChanged", New EventHandler(Sub(sender As Object, e As EventArgs) MsgBox(DirectCast(sender, CheckBox).Name & " is checked: " & DirectCast(sender, CheckBox).Checked.ToString())))
    End Sub

End Class

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM