Windows 窗体设计器中的设计时错误
生活随笔
收集整理的這篇文章主要介紹了
Windows 窗体设计器中的设计时错误
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?
?
在用 VS.NET進(jìn)行窗體設(shè)計的時候,經(jīng)常會遇到這樣的問題:我們需要在構(gòu)造函數(shù)或者在OnLoad事件中進(jìn)行自己的一些初始化操作,比如連接一個數(shù)據(jù)庫、調(diào)用一個資源文件或者后期綁定一個組件。如果代碼通過編譯,在運(yùn)行時會執(zhí)行得相當(dāng)如你所愿。然而,當(dāng)我們用窗體設(shè)計器打開這樣一個窗體或者繼承的窗體,IDE環(huán)境會拋出非常令人不愉快的異常,比如(NullReferenceException )。 究其原因,主要是窗體設(shè)計器在載入窗體時會自動初始化該對象,自動執(zhí)行諸如構(gòu)造函數(shù)、OnLoad方法和InitializeComponent方法,目的在于能使窗體設(shè)計器展現(xiàn)出可視化的編輯操作環(huán)境。(一些第三方控件也就是利用這個時機(jī)彈出注冊認(rèn)證的)。 現(xiàn)在大家明白了,原來我們通過窗體設(shè)計器打開一個窗體類或控件類時,IDE環(huán)境已經(jīng)悄悄地在宿主進(jìn)程中實例化了我們的類。 如果我們在構(gòu)造函數(shù)中寫了這樣的代碼: [c-sharp] view plaincopy print?這是讓人一眼看過去就覺得最直接最有效的方法,絕對有一種踏破鐵蹄無覓處,得來全不費(fèi)功夫的欣快感——可惜的是,用起來一點(diǎn)不奏效。因為如果該窗體是個獨(dú)立窗體或控件,那一點(diǎn)問題都沒有,DesignMode的值如你所愿為true,但是如果它是包含在其他控件中被拖拽到設(shè)計器中(例如,把設(shè)計好的控件拖入新的WinForms窗體),那么那個接受拖拽的窗體才處于設(shè)計模式,而它不是,它已鬼使神差地進(jìn)入了RunTime模式,然后如我所愿,拋出異常J。 ? 二、利用 Assembly.GetEntryAssembly()方法 判斷執(zhí)行程序入口的組件是不是我們預(yù)想的,如果不是,那么必然是IDE的窗體設(shè)計器調(diào)用的——問題解決——只是有點(diǎn)大炮打蚊子的感覺。 ? 三、定義一個靜態(tài)成員,指示程序所處的模式
此方法我認(rèn)為最好。具體做法是寫一個全局類,也就是構(gòu)造函數(shù)為 private 限制的類,里面的成員都為static靜態(tài)類型。這樣的一個類由于構(gòu)造函數(shù)是私有的,所以不可能自任何地方任何外部代碼中實例化,從而保證了其內(nèi)成員的唯一性。然后,在程序的入口處,把此類的一個用于表示運(yùn)行模式的靜態(tài)成員標(biāo)識為“運(yùn)行時”,下面….一切都好說了,看代碼吧:? [c-sharp] view plaincopy print?
轉(zhuǎn)載自:http://blog.csdn.net/uyi/archive/2006/03/18/628694.aspx
?
print?
public class MyClass : System.WIndows.Forms.Form { public MyClass(string fileName) { InitializeComponent(); FileStream myFile = File.Open( filename ); // 窗體設(shè)計器可能拋出異常! //… } //… }
問題便由此產(chǎn)生,fileName參數(shù)的值是程序在運(yùn)行時傳遞的,設(shè)計時當(dāng)然無從獲得。所以,窗體設(shè)計器在打開此窗體類時,必然會拋出異常,同時窗體將無法正常顯示。 解決這種問題的辦法網(wǎng)上其他朋友說了很多,歸納起來好像主要有以下三種途徑: 一、判斷 this.DesignMode 屬性這是讓人一眼看過去就覺得最直接最有效的方法,絕對有一種踏破鐵蹄無覓處,得來全不費(fèi)功夫的欣快感——可惜的是,用起來一點(diǎn)不奏效。因為如果該窗體是個獨(dú)立窗體或控件,那一點(diǎn)問題都沒有,DesignMode的值如你所愿為true,但是如果它是包含在其他控件中被拖拽到設(shè)計器中(例如,把設(shè)計好的控件拖入新的WinForms窗體),那么那個接受拖拽的窗體才處于設(shè)計模式,而它不是,它已鬼使神差地進(jìn)入了RunTime模式,然后如我所愿,拋出異常J。 ? 二、利用 Assembly.GetEntryAssembly()方法 判斷執(zhí)行程序入口的組件是不是我們預(yù)想的,如果不是,那么必然是IDE的窗體設(shè)計器調(diào)用的——問題解決——只是有點(diǎn)大炮打蚊子的感覺。 ? 三、定義一個靜態(tài)成員,指示程序所處的模式
此方法我認(rèn)為最好。具體做法是寫一個全局類,也就是構(gòu)造函數(shù)為 private 限制的類,里面的成員都為static靜態(tài)類型。這樣的一個類由于構(gòu)造函數(shù)是私有的,所以不可能自任何地方任何外部代碼中實例化,從而保證了其內(nèi)成員的唯一性。然后,在程序的入口處,把此類的一個用于表示運(yùn)行模式的靜態(tài)成員標(biāo)識為“運(yùn)行時”,下面….一切都好說了,看代碼吧:? [c-sharp] view plaincopy print?
?
print?
public class MyClass : System.WIndows.Forms.Form { public MyClass(string fileName) { InitializeComponent(); FileStream myFile = File.Open( filename ); // 窗體設(shè)計器可能拋出異常! //… } //… }
問題便由此產(chǎn)生,fileName參數(shù)的值是程序在運(yùn)行時傳遞的,設(shè)計時當(dāng)然無從獲得。所以,窗體設(shè)計器在打開此窗體類時,必然會拋出異常,同時窗體將無法正常顯示。 解決這種問題的辦法網(wǎng)上其他朋友說了很多,歸納起來好像主要有以下三種途徑: 一、判斷 this.DesignMode 屬性這是讓人一眼看過去就覺得最直接最有效的方法,絕對有一種踏破鐵蹄無覓處,得來全不費(fèi)功夫的欣快感——可惜的是,用起來一點(diǎn)不奏效。因為如果該窗體是個獨(dú)立窗體或控件,那一點(diǎn)問題都沒有,DesignMode的值如你所愿為true,但是如果它是包含在其他控件中被拖拽到設(shè)計器中(例如,把設(shè)計好的控件拖入新的WinForms窗體),那么那個接受拖拽的窗體才處于設(shè)計模式,而它不是,它已鬼使神差地進(jìn)入了RunTime模式,然后如我所愿,拋出異常J。 ? 二、利用 Assembly.GetEntryAssembly()方法 判斷執(zhí)行程序入口的組件是不是我們預(yù)想的,如果不是,那么必然是IDE的窗體設(shè)計器調(diào)用的——問題解決——只是有點(diǎn)大炮打蚊子的感覺。 ? 三、定義一個靜態(tài)成員,指示程序所處的模式
此方法我認(rèn)為最好。具體做法是寫一個全局類,也就是構(gòu)造函數(shù)為 private 限制的類,里面的成員都為static靜態(tài)類型。這樣的一個類由于構(gòu)造函數(shù)是私有的,所以不可能自任何地方任何外部代碼中實例化,從而保證了其內(nèi)成員的唯一性。然后,在程序的入口處,把此類的一個用于表示運(yùn)行模式的靜態(tài)成員標(biāo)識為“運(yùn)行時”,下面….一切都好說了,看代碼吧:? [c-sharp] view plaincopy print?
轉(zhuǎn)載自:http://blog.csdn.net/uyi/archive/2006/03/18/628694.aspx
print?
轉(zhuǎn)載于:https://www.cnblogs.com/lihuali/p/6531679.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Windows 窗体设计器中的设计时错误的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]批处理for命令使用指南
- 下一篇: UVa 11100 旅行2007