WinForm窗體繼承自定義的模板窗體出錯

在開發Winform程序的時候,我們往往需要根據需要做一些自定義的控件模塊,這樣可以給系統模塊重複利用,或者實現更好的效果等功能。而今天自定義一個窗體,然後子窗體繼承的時候出現了一點問題。

問題:

在Windows應用程序中,從現有的窗體繼承,查看子窗體的設計視圖時,會出現錯誤:未將對象引用設置到對象的實例。(設計視圖打不開)

或會出現錯誤:服務容器中已存在服務 System.Windows.Forms.Design.IEventHandlerService。參數名: serviceType 

解決:

把父窗體中Form_Load事件和構造函數中所有代碼都放在!DesignMode裏,即

private void Form_Load(...)
{
  if(!DesignMode)
  {
    //代碼放在這兒
  }
}

如果父窗體的構造方法中也有自己寫的代碼,也得放if(!DesignMode)裏。然後重新生成項目,即可看到子窗體的設計視圖。

繼承過來的子窗體,窗體上的控件都處在鎖定狀態,如果要編輯,需要在控件的屬性面板中把控件的Modifiers屬性改成public。

解釋:

Component.DesignMode 屬性

“一個控件只有在它自己被拖拽到設計器的時候,其 DesignMode 纔是真,如果它被包含在其他控件中被加入到設計器,那麼那個控件纔是在設計模式,而它不是!換句話說,DesignMode 並不能反映當前環境是否是運行時,它只能告訴你,這個控件當前是不是直接被設計器操作(嵌套的已經不算了) 。”

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