C#派生自定义控件面板中OnGotFocus事件调用问题
子类OnGotFocus/OnLostFocus方法未触发的解决办法
1. 修正子类方法的访问修饰符
你代码里的子类MyJobTypeToolchange把OnLostFocus的访问修饰符写成了public override,但基类的OnLostFocus是protected override。C#中重写方法的访问权限不能比基类更宽松,这会导致子类的OnLostFocus无法正确被调用。把它改回protected override即可:
修改后的子类代码:
public class MyJobTypeToolchange : MyJobPanel { public MyJobTypeToolchange() : base() { } protected override void OnGotFocus(EventArgs e) { // 这里的代码现在会被执行 base.OnGotFocus(e); // 保留基类的原有逻辑 } protected override void OnLostFocus(EventArgs e) { // 这里的代码现在会被执行 base.OnLostFocus(e); // 保留基类的原有逻辑 } }
2. 确认实例化的是子类对象
如果你的代码里是用MyJobPanel类型创建了基类实例,那肯定只会触发基类的方法。要确保你创建的是MyJobTypeToolchange的实例,哪怕用基类类型引用也没问题:
// 正确写法:直接创建子类实例 MyJobTypeToolchange toolPanel = new MyJobTypeToolchange(); // 或者用基类类型指向子类实例(多态生效) MyJobPanel jobPanel = new MyJobTypeToolchange();
额外检查项
- 确认控件的
TabStop属性设为true,否则控件无法获取焦点,OnGotFocus事件根本不会触发。 - 检查基类中有没有阻止事件传递的逻辑,比如有没有错误地修改了焦点相关的属性。
内容的提问来源于stack exchange,提问作者Gagagu
相关产品推荐
相关产品推荐

