WinForm 創建窗口句柄時出錯

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章