如何移除EventHandler?移除KryptonTextBox事件处理程序失败求助
解决移除KryptonTextBox TextChanged事件无效的问题
嘿,我一眼就发现你代码里的关键问题啦!咱们一步步来捋清楚:
核心错误:移除事件时用错了处理方法
你绑定事件的时候,给符合条件的KryptonTextBox加的是SetSixH5WhyDirty这个处理程序:
AddHandler tb.TextChanged, AddressOf SetSixH5WhyDirty
但在移除事件的方法里,你却尝试移除一个完全不同的方法UnSetSixH5WhyDirty:
RemoveHandler tb.TextChanged, AddressOf UnSetSixH5WhyDirty
.NET的事件系统有个严格规则:必须使用和绑定阶段完全相同的方法地址,才能成功移除事件处理程序。这两个是不同的方法,所以你的移除操作根本找不到要删除的处理程序,自然无效。
修正后的移除方法
另外,你绑定事件时判断了tb.Tag <> "NoCheck",移除时也应该保留这个判断,避免对那些从未绑定过事件的控件做无用操作。修改后的RemoveDirtyEventSixH5Why方法应该是这样:
Public Sub RemoveDirtyEventSixH5Why(ByVal ctrl As Control) For Each c As Control In ctrl.Controls If TypeOf c Is KryptonTextBox Then Dim tb As KryptonTextBox = CType(c, KryptonTextBox) ' 只移除之前绑定过事件的控件(Tag不等于"NoCheck"的) If tb.Tag <> "NoCheck" Then ' 这里要和绑定的方法完全一致! RemoveHandler tb.TextChanged, AddressOf SetSixH5WhyDirty End If End If If c.Controls.Count > 0 Then RemoveDirtyEventSixH5Why(c) End If Next End Sub
额外说明
至于你写的UnSetSixH5WhyDirty方法,如果你只是想移除事件(而不是替换成另一个处理程序),那这个方法完全用不上,可以直接删掉。移除事件的本质是把SetSixH5WhyDirty从控件的TextChanged事件列表中移除,之后文本变化时就不会再触发这个方法了。
验证建议
你可以在移除事件前后,手动修改文本观察TxtHiddenSixH5WhyStatus是否还会被设为1,或者通过调试查看事件处理程序的数量,来确认移除是否生效。
内容的提问来源于stack exchange,提问作者Søren Strøm
相关产品推荐
相关产品推荐

