Vb.net 使用变量作为操作动态创建事件句柄

Vb.net 使用变量作为操作动态创建事件句柄,vb.net,codedom,addhandler,Vb.net,Codedom,Addhandler,我正在努力改进我们的动态报告系统。我想向我在表单上动态创建的对象添加事件句柄。其功能之一是从第一个列表框中选择的内容填充列表框。i、 e.用户选择一个城镇,第二个列表框由居住在该城镇的所有人填充 objectaction和objectactionfunction将存储在系统中的SQL表中。我还希望将objectactionfunction代码存储在表中,并在运行时动态创建它。我一直在调查密码。我看的方向对吗。 下面是伪代码 dim objectaction as string dim objec

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

objectaction和objectactionfunction将存储在系统中的SQL表中。我还希望将objectactionfunction代码存储在表中,并在运行时动态创建它。我一直在调查密码。我看的方向对吗。 下面是伪代码

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

addHandler textbox1.objectaction, addressof objectactionfunction

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

导入系统反射
公开课表格1
私有子表单1_Load(发送方作为对象,e作为事件参数)处理MyBase.Load
Dim eventName=“离开”
Dim methodName=“TextBox1\u离开”
Dim targetType=TextBox1.GetType()
Dim[event]=targetType.GetEvent(eventName)
Dim eventHandlerType=[event].eventHandlerType
Dim eventHandlerMethod=Me.GetType().GetMethod(methodName、BindingFlags.NonPublic或BindingFlags.Instance)
Dim eventHandlerDelegate=eventHandlerMethod.CreateDelegate(eventHandlerType,Me)
[event].AddEventHandler(TextBox1,eventHandlerDelegate)
端接头
私有子文本框1_Leave(发送者作为对象,e作为事件参数)
MessageBox.Show(“成功!”)
端接头
末级
正如我在评论中所说,代码相当冗长,但就是这样。下面是一个扩展方法,您可以使用它编写一次代码,并在任何您喜欢的地方使用它:

导入系统反射
导入System.Runtime.CompilerServices
公共模块对象扩展
公共子加法器(源作为对象,
eventName作为字符串,
eventHandlerName作为字符串,
eventHandlerSource(作为对象)
Dim[event]=source.GetType().GetEvent(eventName)
Dim eventHandlerMethod=eventHandlerSource.GetType().GetMethod(eventHandlerName、BindingFlags.NonPublic或BindingFlags.Instance)
Dim eventHandlerDelegate=eventHandlerMethod.CreateDelegate([event].EventHandlerType,eventHandlerSource)
[event].AddEventHandler(源,eventHandlerDelegate)
端接头
端模块
示例用法:

Dim eventName=“离开”
Dim methodName=“TextBox1\u离开”
TextBox1.AddEventHandler(事件名、方法名、Me)

如果要使用
字符串
存储标识符的名称,则可能需要查看反射。我从未尝试过使用反射注册事件处理程序,但我认为这是可能的,因为您可以执行诸如获取属性值和调用方法之类的操作。反射代码相当冗长,但这正是野兽的本性。嗨,jmcillhinney,非常感谢你的代码,它帮助我解决了问题的第一部分。现在,对于第二部分,如何从变量创建下面的内容并让它运行“Private Sub TextBox1_Leave(发送者作为对象,e作为事件参数)MessageBox.Show(“Success!”)End Sub'@SeanZA,我已经在回答中演示了这一点。假设您正在使用扩展方法,则在要处理其事件的对象上调用它,并将事件名称作为
字符串
传递,将事件处理方法的名称作为
字符串
传递,以及事件处理程序所属的对象。如果我没有看错您的问题,那么这两个
String
值来自您的数据库。如果您正在处理
TextBox
的事件,那么您可能正在表单中运行代码,因此表单本身可能拥有该方法,因此
Me
@SeanZA,我重新阅读了您的问题,我发现您还希望将事件处理程序代码存储在数据库中。对不起,我第一次错过了。那是另一回事。特别是考虑到您已经接受了这个答案,我可能会建议您创建另一个关于事件处理程序代码的问题,因为这与注册事件处理程序是不同的。