今天遇到一個問題,見上圖,控件是自己寫的,不是標準的控件 在執行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()這個方法是有意義的。