请教AddHandler 和 RemoveHandler 的问题

ctjh900801 2014-10-07 05:50:38
各位大大好 小弟在使用AddHandler 的指令上 时 发生的一些问题 所以想请教一下各位大哥

就是我写了两个副程式



Sub Combin()

AddHandler BTN.Click,Sub() Test(DDL,SSP)

end Sub



当我按了BTN这个按钮后 会触发Test的副程式

然后我另外写了一个副程式要去解除这个功能




Sub UnCombine()

RemoveHandler BTN.Click,Sub() Test(DDL,SSP)

End Sub



但现在发生的问题是 我似乎无法这样写 去解除BTN 这个按钮触发Test 的副程式

我叫了UnCombine 的副程式后 按了BTN的按钮 它还是继续在呼叫Test的副程式

此外 编译器这边跑出了一些警告讯习

Lambda 运算式将不会从这个事件处理常式中移除,请将Lambda 运算式指派给变数,然后使用该变树来加入和移除事件

这是什么意思啊????? 请有经验的大大协助我解决问题 谢谢
...全文
962 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ctjh900801 2014-10-08
  • 打赏
  • 举报
回复
抱歉 有打错 我发一次

Dim _PropertyInfo As PropertyInfo = GetType(Checkbox).GetProperty("Events", BindingFlags.Instance Or BindingFlags.NonPublic)
        If _PropertyInfo Is Nothing Then Exit Sub
        Dim _EventList As EventHandlerList = CType(_PropertyInfo.GetValue(Checkbox1, Nothing), EventHandlerList)
        If _EventList Is Nothing Then Exit Sub
        Dim _List As EventHandlerList = DirectCast(_EventList, EventHandlerList)
        Dim _FieldInfo As FieldInfo = (GetType(Control)).GetField("EventCheckedChanged", BindingFlags.Static Or BindingFlags.NonPublic)
        If _FieldInfo Is Nothing Then Exit Sub
        Dim _ObjectDelegate As [Delegate] = _List(_FieldInfo.GetValue(Checkbox1))
        If _ObjectDelegate Is Nothing Then Exit Sub
          
        For Each eh As [Delegate] In _ObjectDelegate.GetInvocationList()
            RemoveHandler Checkbox1.CheckedChanged, eh
        Next
    End Sub

这是我目前测试的代码
ctjh900801 2014-10-08
  • 打赏
  • 举报
回复
wuyazhe 大大 刚刚测试了您的方法 您的方法确实可行 只不过这个好像是只针对Button 这个物件才有用 我改成用Checkbox 如法炮制 修改一些参数如下所示

Dim _PropertyInfo As PropertyInfo = GetType(Button).GetProperty("Events", BindingFlags.Instance Or BindingFlags.NonPublic)
        If _PropertyInfo Is Nothing Then Exit Sub
        Dim _EventList As EventHandlerList = CType(_PropertyInfo.GetValue(Checkbox1, Nothing), EventHandlerList)
        If _EventList Is Nothing Then Exit Sub
        Dim _List As EventHandlerList = DirectCast(_EventList, EventHandlerList)
        Dim _FieldInfo As FieldInfo = (GetType(Control)).GetField("EventCheckedChanged", BindingFlags.Static Or BindingFlags.NonPublic)
        If _FieldInfo Is Nothing Then Exit Sub
        Dim _ObjectDelegate As [Delegate] = _List(_FieldInfo.GetValue(Checkbox1))
        If _ObjectDelegate Is Nothing Then Exit Sub
         
        For Each eh As [Delegate] In _ObjectDelegate.GetInvocationList()
            RemoveHandler Checkbox1.CheckedChanged, eh
        Next
    End Sub
好像这样还不可以 我做测试后 还是解除不掉Checkbox对应地方法 请问一下 这个部份的代码 到底还要改哪些参数呢?
ctjh900801 2014-10-08
  • 打赏
  • 举报
回复
caozhy 大大 我现在依照您提供的思路 做了以下的测试

sub 绑定()
 AddHandler BTN.Click,Addressof Test_lambda
end sub

sub 解除()
RemoveHandler BTN.Click,Addressof  Test_lambda
end sub

Sub Test_lambda()
 Test(DDL,SSP)
end sub 

测试结果是 我绑定后 然后再呼叫了解除的副程式 它还是一样 没有移除掉我按下BTN 后会呼叫的Test(DDL,SSP) 这边当我写了RemoveHandler BTN.Click,Addressof Test_lambda 的代码后 编译器出现了些警告讯习 Addressof' 运算式在此内容中没有作用, 因为Addressof 的方法引数必须以宽松的方式转换成事件的委派型别, 请将'Addressof' 的运算式指派给变数,然后用该变数来加入或移除作为处理常式的方法
ctjh900801 2014-10-08
  • 打赏
  • 举报
回复
谢谢版主大大的指导 我的问题解开了 感激
兔子-顾问 2014-10-08
  • 打赏
  • 举报
回复
添加,删除匿名方法注册的事件,只是个“花子”,展示下能实现,但最终不建议这么干,你本来就是要添加和删除的,就别用匿名了,给自己找麻烦呢么。
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        AddHandler Button3.Click, AddressOf MyButtonClick
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        RemoveHandler Button3.Click, AddressOf MyButtonClick
    End Sub

    Private Sub MyButtonClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
        MessageBox.Show("test")
    End Sub
End Class
是可以移除的
threenewbee 2014-10-07
  • 打赏
  • 举报
回复
不要用AddHandler添加Lambda表达式,这样删除不掉,应该把 Sub() Test(DDL,SSP) 完整写个方法: Sub SomeSub() Test(DDL,SSP) End Sub 然后添加它: AddHandler BTN.Click, SomeSub
兔子-顾问 2014-10-07
  • 打赏
  • 举报
回复
拖3个按钮即可
兔子-顾问 2014-10-07
  • 打赏
  • 举报
回复
弄个简单的按钮界面,然后复制下面代码,可以移除匿名的事件。
Imports System.Reflection
Imports System.ComponentModel

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        AddHandler Button3.Click, Sub() MessageBox.Show("test")
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

        Dim _PropertyInfo As PropertyInfo = GetType(Button).GetProperty("Events", BindingFlags.Instance Or BindingFlags.NonPublic)
        If _PropertyInfo Is Nothing Then Exit Sub
        Dim _EventList As EventHandlerList = CType(_PropertyInfo.GetValue(Button3, Nothing), EventHandlerList)
        If _EventList Is Nothing Then Exit Sub
        Dim _List As EventHandlerList = DirectCast(_EventList, EventHandlerList)
        Dim _FieldInfo As FieldInfo = (GetType(Control)).GetField("EventClick", BindingFlags.Static Or BindingFlags.NonPublic)
        If _FieldInfo Is Nothing Then Exit Sub
        Dim _ObjectDelegate As [Delegate] = _List(_FieldInfo.GetValue(Button3))
        If _ObjectDelegate Is Nothing Then Exit Sub
        
        For Each eh As [Delegate] In _ObjectDelegate.GetInvocationList()
            RemoveHandler Button3.Click, eh
        Next
    End Sub

End Class
  • 打赏
  • 举报
回复
AddHandler BTN.Click,addressof Test
RemoveHandler BTN.Click,addressof Test

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧