微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用变量作为动作动态创建事件句柄

如何解决使用变量作为动作动态创建事件句柄

我正在努力改进我们的动态报告系统。我想向我在表单上动态创建的对象添加事件句柄。其功能之一是从第一个列表框中选择的内容填充列表框。即用户选择一个城镇,第二个列表框由居住在该城镇的所有人填充。

objectaction 和 objectactionfunction 将存储在系统中的 sql 表中。我还想将 objectactionfunction 代码存储在表中并在运行时动态创建它。我一直在研究 CodeDOM。我是否在寻找正确的方向。 下面是伪代码

dim objectaction as string
dim objectactionfunction as string
objectaction = "LostFocus"
objectactionfunction =" "

addHandler textBox1.objectaction,addressof objectactionfunction

解决方法

以下是使用反射注册事件处理程序的示例,使用 Strings 指定事件名称和事件处理程序名称:

Imports System.Reflection

Public Class Form1

    Private Sub Form1_Load(sender As Object,e As EventArgs) Handles MyBase.Load
        Dim eventName = "Leave"
        Dim methodName = "TextBox1_Leave"

        Dim targetType = TextBox1.GetType()
        Dim [event] = targetType.GetEvent(eventName)
        Dim eventHandlerType = [event].EventHandlerType
        Dim eventHandlerMethod = Me.GetType().GetMethod(methodName,BindingFlags.NonPublic Or BindingFlags.Instance)
        Dim eventHandlerDelegate = eventHandlerMethod.CreateDelegate(eventHandlerType,Me)

        [event].AddEventHandler(TextBox1,eventHandlerDelegate)
    End Sub

    Private Sub TextBox1_Leave(sender As Object,e As EventArgs)
        MessageBox.Show("Success!")
    End Sub

End Class

正如我在评论中所说,代码相当冗长,但这就是它的方式。这是一个扩展方法,您可以使用它编写一次代码并随心所欲地使用它:

Imports System.Reflection
Imports System.Runtime.CompilerServices

Public Module ObjectExtensions

    <Extension>
    Public Sub AddEventHandler(source As Object,eventName As String,eventHandlerName As String,eventHandlerSource As Object)
        Dim [event] = source.GetType().GetEvent(eventName)
        Dim eventHandlerMethod = eventHandlerSource.GetType().GetMethod(eventHandlerName,BindingFlags.NonPublic Or BindingFlags.Instance)
        Dim eventHandlerDelegate = eventHandlerMethod.CreateDelegate([event].EventHandlerType,eventHandlerSource)

        [event].AddEventHandler(source,eventHandlerDelegate)
    End Sub

End Module

示例用法:

Dim eventName = "Leave"
Dim methodName = "TextBox1_Leave"

TextBox1.AddEventHandler(eventName,methodName,Me)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。