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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:02:36