日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

Windows 窗体设计器中的设计时错误

發(fā)布時(shí)間:2025/7/14 windows 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows 窗体设计器中的设计时错误 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

?

在用 VS.NET進(jìn)行窗體設(shè)計(jì)的時(shí)候,經(jīng)常會(huì)遇到這樣的問題:我們需要在構(gòu)造函數(shù)或者在OnLoad事件中進(jìn)行自己的一些初始化操作,比如連接一個(gè)數(shù)據(jù)庫(kù)、調(diào)用一個(gè)資源文件或者后期綁定一個(gè)組件。如果代碼通過編譯,在運(yùn)行時(shí)會(huì)執(zhí)行得相當(dāng)如你所愿。然而,當(dāng)我們用窗體設(shè)計(jì)器打開這樣一個(gè)窗體或者繼承的窗體,IDE環(huán)境會(huì)拋出非常令人不愉快的異常,比如(NullReferenceException )。 究其原因,主要是窗體設(shè)計(jì)器在載入窗體時(shí)會(huì)自動(dòng)初始化該對(duì)象,自動(dòng)執(zhí)行諸如構(gòu)造函數(shù)、OnLoad方法和InitializeComponent方法,目的在于能使窗體設(shè)計(jì)器展現(xiàn)出可視化的編輯操作環(huán)境。(一些第三方控件也就是利用這個(gè)時(shí)機(jī)彈出注冊(cè)認(rèn)證的)。 現(xiàn)在大家明白了,原來我們通過窗體設(shè)計(jì)器打開一個(gè)窗體類或控件類時(shí),IDE環(huán)境已經(jīng)悄悄地在宿主進(jìn)程中實(shí)例化了我們的類。 如果我們?cè)跇?gòu)造函數(shù)中寫了這樣的代碼: [c-sharp] view plaincopy print?
  • public?class?MyClass?:?System.WIndows.Forms.Form??
  • {??
  • public?MyClass(string?fileName)??
  • {???
  • InitializeComponent();??
  • FileStream?myFile?=?File.Open(?filename?);?//?窗體設(shè)計(jì)器可能拋出異常!??
  • //…??
  • ?????????}??
  • ??
  • ?????????//…??
  • }??
  • public class MyClass : System.WIndows.Forms.Form { public MyClass(string fileName) { InitializeComponent(); FileStream myFile = File.Open( filename ); // 窗體設(shè)計(jì)器可能拋出異常! //… } //… } 問題便由此產(chǎn)生,fileName參數(shù)的值是程序在運(yùn)行時(shí)傳遞的,設(shè)計(jì)時(shí)當(dāng)然無從獲得。所以,窗體設(shè)計(jì)器在打開此窗體類時(shí),必然會(huì)拋出異常,同時(shí)窗體將無法正常顯示。 解決這種問題的辦法網(wǎng)上其他朋友說了很多,歸納起來好像主要有以下三種途徑: 一、判斷 this.DesignMode 屬性
    這是讓人一眼看過去就覺得最直接最有效的方法,絕對(duì)有一種踏破鐵蹄無覓處,得來全不費(fèi)功夫的欣快感——可惜的是,用起來一點(diǎn)不奏效。因?yàn)槿绻摯绑w是個(gè)獨(dú)立窗體或控件,那一點(diǎn)問題都沒有,DesignMode的值如你所愿為true,但是如果它是包含在其他控件中被拖拽到設(shè)計(jì)器中(例如,把設(shè)計(jì)好的控件拖入新的WinForms窗體),那么那個(gè)接受拖拽的窗體才處于設(shè)計(jì)模式,而它不是,它已鬼使神差地進(jìn)入了RunTime模式,然后如我所愿,拋出異常J ? 二、利用 Assembly.GetEntryAssembly()方法 判斷執(zhí)行程序入口的組件是不是我們預(yù)想的,如果不是,那么必然是IDE的窗體設(shè)計(jì)器調(diào)用的——問題解決——只是有點(diǎn)大炮打蚊子的感覺。 ? 三、定義一個(gè)靜態(tài)成員,指示程序所處的模式
    此方法我認(rèn)為最好。具體做法是寫一個(gè)全局類,也就是構(gòu)造函數(shù)為 private 限制的類,里面的成員都為static靜態(tài)類型。這樣的一個(gè)類由于構(gòu)造函數(shù)是私有的,所以不可能自任何地方任何外部代碼中實(shí)例化,從而保證了其內(nèi)成員的唯一性。然后,在程序的入口處,把此類的一個(gè)用于表示運(yùn)行模式的靜態(tài)成員標(biāo)識(shí)為“運(yùn)行時(shí)”,下面….一切都好說了,看代碼吧:? [c-sharp] view plaincopy print?
  • //全局類??
  • public?class?GlobalClass??
  • {??
  • //私有構(gòu)造器,防止實(shí)例化??
  • private?GlobalClass(){}??
  • //用于標(biāo)識(shí)運(yùn)行時(shí)/設(shè)計(jì)時(shí)的bool型靜態(tài)成員,初始值設(shè)為false??
  • public?static?bool?RunTimeMode?=?false;??
  • }??
  • ???
  • //包含程序入口的類??
  • Public?class?Entry??
  • {??
  • …??
  • //主線程入口點(diǎn),窗體設(shè)計(jì)器絕不會(huì)執(zhí)行此方法??
  • static?void?Main(string[]?args)??
  • {??
  • ?????????//置為true??
  • GlobalClass.RunTimeMode?=?true;??
  • //…..??
  • ?????????}??
  • ?????????//…??
  • }??
  • ???
  • //某個(gè)窗體類??
  • public?class?MyForm?:?System.Windows.Forms.Form??
  • {??
  • ?????????public?MyForm()??
  • ?????????{??
  • ???????????????????//窗體設(shè)計(jì)器必須調(diào)用的??
  • ???????????????????InitializeComponent();??
  • ???????????????????//判斷運(yùn)行模式??
  • ???????????????????If(?GlobalClass.RunTimeMode?)??
  • ???????????????????{??
  • ????????????????????????????//在此處做一些窗體設(shè)計(jì)器會(huì)報(bào)錯(cuò)的事情??
  • ???????????????????}??
  • ???????????????????//…??
  • ?????????}??
  • ?????????//…??
  • }??
  • //全局類 public class GlobalClass { //私有構(gòu)造器,防止實(shí)例化 private GlobalClass(){} //用于標(biāo)識(shí)運(yùn)行時(shí)/設(shè)計(jì)時(shí)的bool型靜態(tài)成員,初始值設(shè)為false public static bool RunTimeMode = false; } //包含程序入口的類 Public class Entry { … //主線程入口點(diǎn),窗體設(shè)計(jì)器絕不會(huì)執(zhí)行此方法 static void Main(string[] args) { //置為true GlobalClass.RunTimeMode = true; //….. } //… } //某個(gè)窗體類 public class MyForm : System.Windows.Forms.Form { public MyForm() { //窗體設(shè)計(jì)器必須調(diào)用的 InitializeComponent(); //判斷運(yùn)行模式 If( GlobalClass.RunTimeMode ) { //在此處做一些窗體設(shè)計(jì)器會(huì)報(bào)錯(cuò)的事情 } //… } //… } 呵呵,問題圓滿解決。其實(shí)這樣一個(gè)全局類在我們平時(shí)設(shè)計(jì)系統(tǒng)的時(shí)候會(huì)經(jīng)常用到,多用于存儲(chǔ)一些對(duì)象間的交互數(shù)據(jù)或者運(yùn)行時(shí)環(huán)境參數(shù)。 如果大家有什么更好的辦法解決所述問題,記得分享哦 :)
    轉(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è)計(jì)器可能拋出異常!?
  • //…?
  • ???????? }?
  • ?
  • ???????? //…?
  • }?
  • public class MyClass : System.WIndows.Forms.Form { public MyClass(string fileName) { InitializeComponent(); FileStream myFile = File.Open( filename ); // 窗體設(shè)計(jì)器可能拋出異常! //… } //… }

    問題便由此產(chǎn)生,fileName參數(shù)的值是程序在運(yùn)行時(shí)傳遞的,設(shè)計(jì)時(shí)當(dāng)然無從獲得。所以,窗體設(shè)計(jì)器在打開此窗體類時(shí),必然會(huì)拋出異常,同時(shí)窗體將無法正常顯示。 解決這種問題的辦法網(wǎng)上其他朋友說了很多,歸納起來好像主要有以下三種途徑: 一、判斷 this.DesignMode 屬性
    這是讓人一眼看過去就覺得最直接最有效的方法,絕對(duì)有一種踏破鐵蹄無覓處,得來全不費(fèi)功夫的欣快感——可惜的是,用起來一點(diǎn)不奏效。因?yàn)槿绻摯绑w是個(gè)獨(dú)立窗體或控件,那一點(diǎn)問題都沒有,DesignMode的值如你所愿為true,但是如果它是包含在其他控件中被拖拽到設(shè)計(jì)器中(例如,把設(shè)計(jì)好的控件拖入新的WinForms窗體),那么那個(gè)接受拖拽的窗體才處于設(shè)計(jì)模式,而它不是,它已鬼使神差地進(jìn)入了RunTime模式,然后如我所愿,拋出異常J ? 二、利用 Assembly.GetEntryAssembly()方法 判斷執(zhí)行程序入口的組件是不是我們預(yù)想的,如果不是,那么必然是IDE的窗體設(shè)計(jì)器調(diào)用的——問題解決——只是有點(diǎn)大炮打蚊子的感覺。 ? 三、定義一個(gè)靜態(tài)成員,指示程序所處的模式
    此方法我認(rèn)為最好。具體做法是寫一個(gè)全局類,也就是構(gòu)造函數(shù)為 private 限制的類,里面的成員都為static靜態(tài)類型。這樣的一個(gè)類由于構(gòu)造函數(shù)是私有的,所以不可能自任何地方任何外部代碼中實(shí)例化,從而保證了其內(nèi)成員的唯一性。然后,在程序的入口處,把此類的一個(gè)用于表示運(yùn)行模式的靜態(tài)成員標(biāo)識(shí)為“運(yùn)行時(shí)”,下面….一切都好說了,看代碼吧:? [c-sharp] view plaincopy print?
  • //全局類?
  • public?class GlobalClass?
  • {?
  • //私有構(gòu)造器,防止實(shí)例化?
  • private GlobalClass(){}?
  • //用于標(biāo)識(shí)運(yùn)行時(shí)/設(shè)計(jì)時(shí)的bool型靜態(tài)成員,初始值設(shè)為false?
  • public?static?bool RunTimeMode = false;?
  • }?
  • ??
  • //包含程序入口的類?
  • Public class Entry?
  • {?
  • …?
  • //主線程入口點(diǎn),窗體設(shè)計(jì)器絕不會(huì)執(zhí)行此方法?
  • static?void Main(string[] args)?
  • {?
  • ???????? //置為true?
  • GlobalClass.RunTimeMode = true;?
  • //…..?
  • ???????? }?
  • ???????? //…?
  • }?
  • ??
  • //某個(gè)窗體類?
  • public?class MyForm : System.Windows.Forms.Form?
  • {?
  • ???????? public MyForm()?
  • ???????? {?
  • ?????????????????? //窗體設(shè)計(jì)器必須調(diào)用的?
  • ?????????????????? InitializeComponent();?
  • ?????????????????? //判斷運(yùn)行模式?
  • ?????????????????? If( GlobalClass.RunTimeMode )?
  • ?????????????????? {?
  • ??????????????????????????? //在此處做一些窗體設(shè)計(jì)器會(huì)報(bào)錯(cuò)的事情?
  • ?????????????????? }?
  • ?????????????????? //…?
  • ???????? }?
  • ???????? //…?
  • }?
  • //全局類 public class GlobalClass { //私有構(gòu)造器,防止實(shí)例化 private GlobalClass(){} //用于標(biāo)識(shí)運(yùn)行時(shí)/設(shè)計(jì)時(shí)的bool型靜態(tài)成員,初始值設(shè)為false public static bool RunTimeMode = false; } //包含程序入口的類 Public class Entry { … //主線程入口點(diǎn),窗體設(shè)計(jì)器絕不會(huì)執(zhí)行此方法 static void Main(string[] args) { //置為true GlobalClass.RunTimeMode = true; //….. } //… } //某個(gè)窗體類 public class MyForm : System.Windows.Forms.Form { public MyForm() { //窗體設(shè)計(jì)器必須調(diào)用的 InitializeComponent(); //判斷運(yùn)行模式 If( GlobalClass.RunTimeMode ) { //在此處做一些窗體設(shè)計(jì)器會(huì)報(bào)錯(cuò)的事情 } //… } //… } 呵呵,問題圓滿解決。其實(shí)這樣一個(gè)全局類在我們平時(shí)設(shè)計(jì)系統(tǒng)的時(shí)候會(huì)經(jīng)常用到,多用于存儲(chǔ)一些對(duì)象間的交互數(shù)據(jù)或者運(yùn)行時(shí)環(huán)境參數(shù)。 如果大家有什么更好的辦法解決所述問題,記得分享哦

    ?

    print?

  • public?class MyClass : System.WIndows.Forms.Form?
  • {?
  • public MyClass(string fileName)?
  • {??
  • InitializeComponent();?
  • FileStream myFile = File.Open( filename ); // 窗體設(shè)計(jì)器可能拋出異常!?
  • //…?
  • ???????? }?
  • ?
  • ???????? //…?
  • }?
  • public class MyClass : System.WIndows.Forms.Form { public MyClass(string fileName) { InitializeComponent(); FileStream myFile = File.Open( filename ); // 窗體設(shè)計(jì)器可能拋出異常! //… } //… }

    問題便由此產(chǎn)生,fileName參數(shù)的值是程序在運(yùn)行時(shí)傳遞的,設(shè)計(jì)時(shí)當(dāng)然無從獲得。所以,窗體設(shè)計(jì)器在打開此窗體類時(shí),必然會(huì)拋出異常,同時(shí)窗體將無法正常顯示。 解決這種問題的辦法網(wǎng)上其他朋友說了很多,歸納起來好像主要有以下三種途徑: 一、判斷 this.DesignMode 屬性
    這是讓人一眼看過去就覺得最直接最有效的方法,絕對(duì)有一種踏破鐵蹄無覓處,得來全不費(fèi)功夫的欣快感——可惜的是,用起來一點(diǎn)不奏效。因?yàn)槿绻摯绑w是個(gè)獨(dú)立窗體或控件,那一點(diǎn)問題都沒有,DesignMode的值如你所愿為true,但是如果它是包含在其他控件中被拖拽到設(shè)計(jì)器中(例如,把設(shè)計(jì)好的控件拖入新的WinForms窗體),那么那個(gè)接受拖拽的窗體才處于設(shè)計(jì)模式,而它不是,它已鬼使神差地進(jìn)入了RunTime模式,然后如我所愿,拋出異常J ? 二、利用 Assembly.GetEntryAssembly()方法 判斷執(zhí)行程序入口的組件是不是我們預(yù)想的,如果不是,那么必然是IDE的窗體設(shè)計(jì)器調(diào)用的——問題解決——只是有點(diǎn)大炮打蚊子的感覺。 ? 三、定義一個(gè)靜態(tài)成員,指示程序所處的模式
    此方法我認(rèn)為最好。具體做法是寫一個(gè)全局類,也就是構(gòu)造函數(shù)為 private 限制的類,里面的成員都為static靜態(tài)類型。這樣的一個(gè)類由于構(gòu)造函數(shù)是私有的,所以不可能自任何地方任何外部代碼中實(shí)例化,從而保證了其內(nèi)成員的唯一性。然后,在程序的入口處,把此類的一個(gè)用于表示運(yùn)行模式的靜態(tài)成員標(biāo)識(shí)為“運(yùn)行時(shí)”,下面….一切都好說了,看代碼吧:? [c-sharp] view plaincopy print?
  • //全局類?
  • public?class GlobalClass?
  • {?
  • //私有構(gòu)造器,防止實(shí)例化?
  • private GlobalClass(){}?
  • //用于標(biāo)識(shí)運(yùn)行時(shí)/設(shè)計(jì)時(shí)的bool型靜態(tài)成員,初始值設(shè)為false?
  • public?static?bool RunTimeMode = false;?
  • }?
  • ??
  • //包含程序入口的類?
  • Public class Entry?
  • {?
  • …?
  • //主線程入口點(diǎn),窗體設(shè)計(jì)器絕不會(huì)執(zhí)行此方法?
  • static?void Main(string[] args)?
  • {?
  • ???????? //置為true?
  • GlobalClass.RunTimeMode = true;?
  • //…..?
  • ???????? }?
  • ???????? //…?
  • }?
  • ??
  • //某個(gè)窗體類?
  • public?class MyForm : System.Windows.Forms.Form?
  • {?
  • ???????? public MyForm()?
  • ???????? {?
  • ?????????????????? //窗體設(shè)計(jì)器必須調(diào)用的?
  • ?????????????????? InitializeComponent();?
  • ?????????????????? //判斷運(yùn)行模式?
  • ?????????????????? If( GlobalClass.RunTimeMode )?
  • ?????????????????? {?
  • ??????????????????????????? //在此處做一些窗體設(shè)計(jì)器會(huì)報(bào)錯(cuò)的事情?
  • ?????????????????? }?
  • ?????????????????? //…?
  • ???????? }?
  • ???????? //…?
  • }?
  • //全局類 public class GlobalClass { //私有構(gòu)造器,防止實(shí)例化 private GlobalClass(){} //用于標(biāo)識(shí)運(yùn)行時(shí)/設(shè)計(jì)時(shí)的bool型靜態(tài)成員,初始值設(shè)為false public static bool RunTimeMode = false; } //包含程序入口的類 Public class Entry { … //主線程入口點(diǎn),窗體設(shè)計(jì)器絕不會(huì)執(zhí)行此方法 static void Main(string[] args) { //置為true GlobalClass.RunTimeMode = true; //….. } //… } //某個(gè)窗體類 public class MyForm : System.Windows.Forms.Form { public MyForm() { //窗體設(shè)計(jì)器必須調(diào)用的 InitializeComponent(); //判斷運(yùn)行模式 If( GlobalClass.RunTimeMode ) { //在此處做一些窗體設(shè)計(jì)器會(huì)報(bào)錯(cuò)的事情 } //… } //… } 呵呵,問題圓滿解決。其實(shí)這樣一個(gè)全局類在我們平時(shí)設(shè)計(jì)系統(tǒng)的時(shí)候會(huì)經(jīng)常用到,多用于存儲(chǔ)一些對(duì)象間的交互數(shù)據(jù)或者運(yùn)行時(shí)環(huán)境參數(shù)。 如果大家有什么更好的辦法解決所述問題,記得分享哦 :)
    轉(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ù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的Windows 窗体设计器中的设计时错误的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。