如何从代码触发自定义TextBox组件的Leave事件?
嘿,我来帮你搞定这个问题!首先咱们先理清楚你的代码逻辑:你写的MyLeave方法是通过Handles MyBase.Leave绑定到了基类TextBox的Leave事件上——也就是说,只有当TextBox本身的Leave事件被触发时,这个方法才会自动执行。所以你想要的“不直接调用MyLeave却触发这个行为”,本质就是要让TextBox的Leave事件正常触发,或者用符合WinForms事件机制的方式来触发对应的逻辑。
下面给你两种靠谱的方案:
方案1:模拟真实的焦点离开(最贴近用户操作的方式)
如果你的界面上有其他可以获得焦点的控件(比如另一个TextBox、Button之类的),直接让那个控件获取焦点就行,这样你的MyTextBox就会自动失去焦点,触发Leave事件,进而执行MyLeave里的变色逻辑:
' 假设你有一个名为Button1的按钮,让它获得焦点 Button1.Focus()
这个方法完全模拟了用户的真实操作,不需要修改你的自定义控件代码,但缺点是依赖于界面上存在其他可聚焦控件。
方案2:在自定义控件里添加触发方法(更灵活的代码触发方式)
WinForms控件的事件触发都是通过调用On[EventName]这个受保护方法来实现的——比如TextBox的Leave事件就是在OnLeave方法里触发的。你可以在你的MyTextBox类里添加一个公共方法,用来调用基类的OnLeave,这样就能间接触发Leave事件和对应的逻辑:
Public Class MyTextBox Inherits TextBox Sub MyLeave() Handles MyBase.Leave Me.BackColor = Color.Red End Sub ' 新增这个方法,用来触发Leave事件的逻辑 Public Sub TriggerLeaveEvent() ' 调用基类的OnLeave方法,会自动触发Leave事件,执行MyLeave里的代码 MyBase.OnLeave(EventArgs.Empty) End Sub End Class
之后你在外部代码里就可以这样调用:
MyTextBox1.TriggerLeaveEvent()
这种方式不需要依赖其他控件,完全通过代码触发,而且符合WinForms的事件机制,比直接调用MyLeave更规范。
关于自定义事件:完全不需要!
你的场景里根本不需要创建自定义事件,因为你已经利用了基类TextBox自带的Leave事件。只有当你需要区分“真实的焦点离开”和“代码主动触发的行为”,或者需要额外的事件逻辑时,才需要考虑自定义事件——目前这个需求完全用现有事件机制就能解决。
内容的提问来源于stack exchange,提问作者lucap.13

