WinForm窗體設計器錯誤解決方法


 

我們開發WinForm應用程序的時候,經常在窗體設計器出現一些錯誤提示:

看上面的錯誤信息就知道其實在設計器時程序已經運行了拖進窗體的控件的構造函數和Load事件等。看網上好多資料都說是DesignMode屬性的問題,試了下,感覺不行的。下面新建個用戶控件,在構造函數里面處理看看是否是DesignMode:

 

    public partial class TestControl : UserControl { public TestControl() { InitializeComponent(); if (DesignMode) { this.lblMsg.Text = "TRUE"; } else { this.lblMsg.Text = "FALSE"; } } }

生成項目,VS工具箱出現用戶控件TestControl

新建一個窗體,往窗體里面拖放TestControl控件,猜猜結果是TRUE還是FALSE?想當然程序還沒運行,處於設計階段應該是TRUE。

No,結果是False!

 

明顯是設計階段,應該是True才對,可結果是False!

關於DesignMode,MSDN的解釋是:

 

網上還有說什么容器控件里面的子控件DesignMode為False之類的,試了下,都不靠譜,難道這是一個坑爹的BUG??

 

解決方法如下:

 

public static bool IsDesignMode() { bool returnFlag = false; #if DEBUG
         if (LicenseManager.UsageMode == LicenseUsageMode.Designtime) { returnFlag = true; } else if (Process.GetCurrentProcess().ProcessName == "devenv") { returnFlag = true; } #endif

         return returnFlag; }

 

其實在設計器階段調用的進程是VS的進程----即devenv,上面的方法才是判斷當前控件是否處於設計模式。

更改后代碼:

    public partial class TestControl : UserControl { public TestControl() { InitializeComponent(); if (PublicFunction.IsDesignMode()) { this.lblMsg.Text = "TRUE"; } else { this.lblMsg.Text = "FALSE"; } } }

重新生成后再次在窗體的設計階段拖放TestControl控件,這才是預料之中的DesignMode:

 

運行對比看看:

設計器時設計模式為TRUE,運行時設計模式為FALSE,符合預期結果。

 

因此,對應這種問題也就引刃而解了,根據錯誤信息找到對應的地方,往往是構造函數或者Load事件里面進行判斷,若是處於設計模式就不執行指定的一些代碼就OK。

 

    private void ScannerControl_Load(object sender, EventArgs e) { if (!PublicFunction.IsDesignMode()) { _初始化Twain(); } }

上面的   _初始化Twain()方法要執行讀取掃描儀和本地存儲配置文件等一系列復雜操作,完全不用再設計器階段執行代碼。

重新生成后再次打開包含該用戶控件的窗體,在設計階段顯示OK:

PS:自定義用戶控件時在該控件所在文件不要寫其他類,也就是一個用戶控件只寫該用戶控件的類(同樣適合於窗體),否則設計器也無法顯示控件;再者,推薦用上面寫的IsDesignMode()方法取代DesignMode屬性,並最后不要在自定義控件或窗體的構造函數中處理設計器無法正常顯示的代碼,改放在Load事件中處理並用IsDesignMode()方法過濾。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM