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