本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议 》和 《 阿里云开发者社区知识产权保护指引 》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单 进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
+关注继续查看

tt.png

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