在開發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 並不能反映當前環境是否是運行時,它只能告訴你,這個控件當前是不是直接被設計器操作(嵌套的已經不算了) 。”