WinForm 创建窗口句柄时出错

    技术2025-09-11  58

    今天遇到一个问题,见上图,控件是自己写的,不是标准的控件 在执行Controls.Add(control),出现上述问题。

    问题的具体描述:根据条件设置移除和加入不同的控件,当前控件不满足条件时,将控件移除,然后加入新的控件。

    代码如下:

       if (this.Panel.Controls.Contains(this.R_Parameter))                 {                     this.Panel.Controls.Remove(this.R_Parameter);                     R_Parameter.Dispose();                 }                 this.RMC_Parameter = new MODE_CONFIG();   this.Panel.Controls.Add(R_Parameter);

    有人提出解决问题的思路是重写报错控件的CreateHandle()方法,代码如下:

       protected override void CreateHandle()         {             if (!IsHandleCreated)             {                 try                 {                     base.CreateHandle();                 }                 catch { }                 finally                 {                     if (!IsHandleCreated)                     {                         base.RecreateHandle();                     }                 }             }         }

    经过测试有所好转,反复测试几次后,问题又出现了。事实证明有所好转,但是没有解决根本的原因。

    后来再查找资料的时候,有人提出,导致这问题出现的原因是被移除的控件没有释放。于是增加Dispose()方法,代码如下:

       if (this.Panel.Controls.Contains(this.R_Parameter))                 {                     this.Panel.Controls.Remove(this.R_Parameter);                     R_Parameter.Dispose();                 }                 this.RMC_Parameter = new MODE_CONFIG();   this.Panel.Controls.Add(R_Parameter);

    再次测试,发现问题解决了,反复几次都没有出现。

    然后注释掉CreateHandle()方法,再测试发现问题又出现了,所以重写CreateHandle()这个方法是有意义的。

     

    Processed: 0.014, SQL: 9