WinForm 创建窗口句柄时出错

举报
AI浩 发表于 2021/12/23 01:46:26 2021/12/23
【摘要】 今天遇到一个问题,见上图,控件是自己写的,不是标准的控件 在执行Controls.Add(control),出现上述问题。 问题的具体描述:根据条件设置移除和加入不同的控件,当前控件不满足条件时,将控件移除,然后加入新的控件。 代码如下:    if (this.Panel.Controls.Contain...

今天遇到一个问题,见上图,控件是自己写的,不是标准的控件 在执行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()这个方法是有意义的。

 

文章来源: wanghao.blog.csdn.net,作者:AI浩,版权归原作者所有,如需转载,请联系作者。

原文链接:wanghao.blog.csdn.net/article/details/107125867

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。