相关文章推荐
力能扛鼎的伤疤  ·  dpkg-buildpackage ...·  1 年前    · 
宽容的苦咖啡  ·  apk - Android - do I ...·  1 年前    · 
苦闷的黄豆  ·  vue3 setup + ts + ...·  1 年前    · 

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

  •