You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:54:19