国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

c#窗體傳值用法實(shí)例詳解

2019-10-29 21:42:24
字體:
供稿:網(wǎng)友

這篇文章主要介紹了c#窗體傳值用法,以實(shí)例形式較為詳細(xì)的分析了C#窗體傳值的各種常用技巧,需要的朋友可以參考下

本文實(shí)例講述了c#窗體傳值用法。分享給大家供大家參考。具體分析如下:

對(duì)于窗體間的數(shù)據(jù)傳遞,是剛開始從事.Net窗體應(yīng)用程序開發(fā)人員碰到的一個(gè)常見問題,在此講幾個(gè)常見的實(shí)現(xiàn)方式。此節(jié)內(nèi)容適用于模式窗體或非模式窗體,部分方式延伸到一般類的操作。

(1)構(gòu)造函數(shù)參數(shù)傳遞

通過構(gòu)造函數(shù)傳遞參數(shù)應(yīng)該是比較基本的參數(shù)傳遞方式,重載構(gòu)造函數(shù),通過帶參數(shù)的構(gòu)造函數(shù)來實(shí)例化窗體。

在窗體類內(nèi)部定義參數(shù)變量,

private object myParams;

實(shí)現(xiàn)構(gòu)造函數(shù),

 

 
  1. public OptionForm(object parameters)  
  2. {  
  3. InitializeComponent();  
  4. this.myParams = parameters;//設(shè)置參數(shù)引用  
  5. }  

實(shí)例化窗體,

OptionForm form = new OptionForm( myParams );

在實(shí)際使用過程中,需要注意傳入的是引用類型還是值類型,處理方式會(huì)有所不同。

(2)使用窗體的屬性

說起屬性關(guān)聯(lián),上面已經(jīng)提到過Form.Owner屬性,下面筆者根據(jù)MSDN文檔來比較完整的講一下,大部分的文字來自MSDN文檔,為保證其完整性,對(duì)其中一些屬性描述進(jìn)行了擴(kuò)展。

Form.Owner 屬性。獲取或設(shè)置擁有此窗體的窗體。

語法,public Form Owner { get; set; }

若要使某窗體歸另一個(gè)窗體所有,可為其 Owner 屬性分配一個(gè)對(duì)將成為所有者的窗體的引用。當(dāng)一個(gè)窗體歸另一窗體所有時(shí),它便隨著所有者窗體最小化和關(guān)閉。例如,如果 Form2 歸窗體 Form1 所有,則關(guān)閉或最小化 Form1 時(shí),F(xiàn)orm2 也會(huì)關(guān)閉或最小化。并且附屬窗體從不顯示在其所有者窗體后面。可以將附屬窗體用于查找和替換窗口之類的窗口,當(dāng)選定所有者窗體時(shí),這些窗口不應(yīng)消失。

Form.OwnedForms 屬性。獲取 Form 對(duì)象的數(shù)組,這些對(duì)象表示此窗體擁有的所有窗體。

語法,public Form[] OwnedForms { get; }

此屬性返回包含此窗體擁有的所有窗體的數(shù)組。要使某窗體歸另一個(gè)窗體所有,可調(diào)用 AddOwnedForm 方法。分配給所有者窗體的窗體將保持被擁有狀態(tài),直到調(diào)用了 RemoveOwnedForm 方法。如果窗體是多文檔界面 (MDI) 父窗體,則除了當(dāng)前打開的所有 MDI 子窗體外,此屬性將返回所有顯示的窗體。

Form.MdiChildren 屬性。獲取窗體的數(shù)組,這些窗體表示以此窗體作為父級(jí)的多文檔界面 (MDI) 子窗體。

語法,public Form[] MdiChildren { get; }

此屬性使您得以獲取對(duì)當(dāng)前在某 MDI 父窗體中打開的所有 MDI 子窗體的引用。若要?jiǎng)?chuàng)建 MDI 子窗體,請(qǐng)將要成為 MDI 父窗體的 Form 分配給該子窗體的 MdiParent 屬性。可以使用此屬性依次通過所有 MDI 子窗體,以執(zhí)行一些操作,如當(dāng) MDI 父窗體關(guān)閉時(shí)將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中,或者根據(jù)應(yīng)用程序中執(zhí)行的操作更新子窗體上的字段。

Form.MdiParent 屬性。獲取或設(shè)置此窗體的當(dāng)前多文檔界面 (MDI) 父窗體。

語法,public Form MdiParent { get; set; }

若要?jiǎng)?chuàng)建 MDI 子窗體,請(qǐng)將要成為 MDI 父窗體的 Form 分配給該子窗體的 MdiParent 屬性。可以從某 MDI 子窗體使用此屬性來獲取所有子窗體都需要的全局信息或者調(diào)用對(duì)所有子窗體執(zhí)行操作的方法。

Form.ActiveForm 靜態(tài)屬性。獲取此應(yīng)用程序的當(dāng)前活動(dòng)窗體。

語法,public static Form ActiveForm { get; }

表示當(dāng)前活動(dòng)窗體,或者如果沒有活動(dòng)窗體,則為空引用。可以使用此方法獲得對(duì)當(dāng)前活動(dòng)窗體的引用,以在該窗體或其控件上執(zhí)行操作。

Form.ActiveMdiChild 屬性。獲取當(dāng)前活動(dòng)的多文檔界面 (MDI) 子窗口。

語法,public Form ActiveMdiChild { get; }

返回表示當(dāng)前活動(dòng)的 MDI 子窗口的 Form,或者如果當(dāng)前沒有子窗口,則返回 空引用。可使用此方法確定 MDI 應(yīng)用程序中是否有任何打開的 MDI 子窗體。也可使用此方法從 MDI 子窗口的 MDI 父窗體或者從應(yīng)用程序中顯示的其他窗體對(duì)該 MDI 子窗口執(zhí)行操作。

ContainerControl.ParentForm 屬性。獲取將容器控件分配給的窗體。

語法,public Form ParentForm { get; }

將容器控件分配給的 Form。

(3)使用公共屬性(念時(shí)注:我比較常用這種方式)

使用公共屬性也是一種比較常用的方式,通過窗體設(shè)計(jì)器添加的控件默認(rèn)訪問修飾符為private級(jí)別,可以設(shè)置成public或Internal(在程序集內(nèi)部可見)來對(duì)外公開。比如對(duì)窗體中的Button進(jìn)行公開,那就可以訪問Button的相關(guān)屬性,同時(shí)也可以注冊(cè)事件或撤銷事件注冊(cè)。如:OptionForm form = new OptionForm();

 

 
  1. form.buttonOK.Click += new EventHandler(buttonOK_Click);  
  2. form.ShowDialog();  

對(duì)于只允許讀取訪問或修改訪問的控件或變量可以通過屬性來控制。對(duì)(1)方式進(jìn)行修改,去除重載構(gòu)造函數(shù),增加屬性也可以實(shí)現(xiàn)同樣的效果。

 

 
  1. public object MyParams  
  2. {  
  3. get { return this.myParams; }  
  4. set { this.myParams = value; }  
  5. }  

(4)使用公共方法

使用公共方法類似于屬性,對(duì)上面的同等實(shí)現(xiàn)如下,

 

 
  1. //獲取參數(shù)  
  2. public object GetParams()  
  3. {  
  4. return this.myParams;  
  5. }  
  6. //設(shè)置參數(shù)  
  7. public void SetParams(object myParams )  
  8. {  
  9. this.myParams = myParams;  
  10. }  

(5)使用靜態(tài)類該方式可以簡(jiǎn)單的理解為靜態(tài)變量全局共享,通過下面代碼能夠比較清楚的理解,先來定義靜態(tài)類,

 

 
  1. public static class ParameterSettings  
  2. {  
  3. //公共靜態(tài)變量  
  4. public static string Username = "Zhengzuo";  
  5. //私有靜態(tài)變量  
  6. private static string userRole = "Administrators";  
  7. //私有靜態(tài)變量  
  8. private static string password = "http://m.survivalescaperooms.com/";  
  9. //內(nèi)部屬性  
  10. internal static string UserRole  
  11. {  
  12. get { return userRole; }  
  13. }  
  14. //公共屬性  
  15. public static string Password  
  16. {  
  17. get { return password; }  
  18. private set { password = value; }  
  19. }  
  20. }  

在需要訪問的地方通過以下方式進(jìn)行:

 

 
  1. string username = ParameterSettings.Username;  
  2. string password = ParameterSettings.Password;  
  3. string userRole = ParameterSettings.UserRole;  
  4. ParameterSettings.Username = "鄭佐";//修改成新用戶名  

(6)窗體實(shí)現(xiàn)Singleton模式

Singleton模式是我們開發(fā)過程中最常用的模式之一。在技術(shù)社區(qū)經(jīng)常看到有人談及對(duì)主窗體實(shí)現(xiàn)Singleton,但個(gè)人認(rèn)為這不是一種妥當(dāng)?shù)淖龇ǎ驗(yàn)闆]有這個(gè)必要。這里通過另一個(gè)自定義類來進(jìn)行演示。假設(shè)UserLoginInfo類用來保存登錄系統(tǒng)后的用戶憑據(jù)。

 

 
  1. public class UserLoginInfo  
  2. {  
  3. //實(shí)現(xiàn)Singleton模式,線程安全。  
  4. private readonly static UserLoginInfo currentUserInfo = new UserLoginInfo();  
  5. //提供全局訪問點(diǎn)  
  6. public static UserLoginInfo CurrentUserInfo  
  7. {  
  8. get { return currentUserInfo; }  
  9. }  
  10. //阻止顯式實(shí)例化,但不能阻止反射方式調(diào)用。  
  11. private UserLoginInfo()  
  12. {  
  13. }  
  14. //公共變量  
  15. public string Username;  
  16. //私有變量  
  17. private static string userRole;  
  18. //私有變量  
  19. private static string password;  
  20. //內(nèi)部屬性  
  21. internal string UserRole  
  22. {  
  23. get { return userRole; }  
  24. set { userRole = value; }  
  25. }  
  26. //公共屬性  
  27. public string Password  
  28. {  
  29. get { return password; }  
  30. internal set { password = value; }  
  31. }  
  32. }  

在其他代碼中進(jìn)行訪問:

 

 
  1. UserLoginInfo.CurrentUserInfo.Username ="鄭佐";  
  2. UserLoginInfo.CurrentUserInfo.UserRole = "dotnetlover";  
  3. UserLoginInfo.CurrentUserInfo.Password = "http://m.survivalescaperooms.com/";  

對(duì)于Singleton模式的實(shí)現(xiàn)方式有很多,編寫時(shí)需要考慮是否需要保證實(shí)例訪問的線程安全問題,以免引發(fā)不可預(yù)料的情況,為了提高性能可以考慮惰性實(shí)例化。

(7)發(fā)布事件進(jìn)行訂閱

通過事件來傳遞參數(shù)應(yīng)該說是一種推的實(shí)現(xiàn)方式,在產(chǎn)生事件時(shí)進(jìn)行被動(dòng)的獲取相關(guān)數(shù)據(jù)。這里將通過一個(gè)自定義事件來演示數(shù)據(jù)的傳輸。

在自定義事件時(shí),標(biāo)準(zhǔn)的做法都會(huì)先定義一個(gè)事件參數(shù)類,要么直接使用基類EventArgs,或者從EventArgs繼承實(shí)現(xiàn)自己的參數(shù)類,假設(shè)自定義基類取名為OptionSettingEventArgs,

 

 
  1. //選項(xiàng)設(shè)置事件參數(shù)類  
  2. public class OptionSettingEventArgs : EventArgs  
  3. {  
  4. private string changedPath;  
  5. //構(gòu)造函數(shù)  
  6. public OptionSettingEventArgs(string changedPath)  
  7. {  
  8. this.changedPath = changedPath;  
  9. }  
  10. //讀取參數(shù)  
  11. public string ChangedPath  
  12. {  
  13. get { return this.changedPath; }  
  14. }  
  15. }  

以上參數(shù)類只包含一個(gè)修改后的路徑參數(shù)。接下去我們要對(duì)原先的OptionForm窗體增加事件定義,這里使用.net 2.0中提供的泛型類來實(shí)現(xiàn)。

 

 
  1. //定義事件  
  2. public event EventHandler<OptionSettingEventArgs> OptionSettingChanged;  
  3. 編寫事件引發(fā)程序如下,  
  4. //引發(fā)OptionSettingChanged事件  
  5. protected virtual void OnOptionSettingChanged(OptionSettingEventArgs e)  
  6. {  
  7. if (OptionSettingChanged != null)  
  8. {  
  9. OptionSettingChanged(this, e);  
  10. }  
  11. }  

對(duì)文件目錄選擇按鈕事件處理程序進(jìn)行修改來實(shí)現(xiàn)事件激發(fā),并沒有考慮直接從文本框直接數(shù)據(jù)輸入方式。

 

 
  1. //通過目錄對(duì)話框設(shè)置新的路徑  
  2. private void buttonBrowser_Click(object sender, EventArgs e)  
  3. {  
  4. FolderBrowserDialog dialog = new FolderBrowserDialog();  
  5. DialogResult result = dialog.ShowDialog(this);  
  6. if (result == DialogResult.OK)  
  7. {  
  8. if(this.textBoxPath.Text != dialog.SelectedPath)  
  9. {  
  10. this.textBoxPath.Text = dialog.SelectedPath;  
  11. OptionSettingEventArgs args = new OptionSettingEventArgs(dialog.SelectedPath);  
  12. OnOptionSettingChanged(args);  
  13. }  
  14. }  
  15. }  

好了,一切準(zhǔn)備工作完成,調(diào)用代碼如下,

 

 
  1. OptionForm form = new OptionForm();  
  2. //注冊(cè)事件  
  3. form.OptionSettingChanged += new EventHandler (form_OptionSettingChanged);  
  4. form.ShowDialog();  

通過以下事件處理程序來驗(yàn)證其正確性,

 

 
  1. private void form_OptionSettingChanged(object sender, OptionSettingEventArgs e)  
  2. {  
  3. string newPath = e.ChangedPath;  
  4. MessageBox.Show(this, String.Format("新路徑為“{0}”。", newPath), "提示");  

希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 剑河县| 贞丰县| 汤原县| 竹溪县| 格尔木市| 台安县| 曲麻莱县| 尼玛县| 日土县| 河南省| 西丰县| 杭州市| 新巴尔虎右旗| 玉屏| 晋宁县| 文登市| 卢湾区| 石柱| 红安县| 稷山县| 金寨县| 白银市| 松江区| 绥滨县| 南丰县| 长沙市| 日喀则市| 沙田区| 定边县| 车致| 天祝| 新兴县| 平江县| 吉林省| 浠水县| 子洲县| 蕉岭县| 伊通| 富川| 平山县| 东宁县|