窗口間傳值的幾種方法
剛開始學Winform的同學基本上都會遇到窗口傳值的問題,怎樣解決問題,事實上就是須要解決你對窗口的一個理解。
一定要記住,窗口(Form),它是一個類(Class)。!
namespace MyForm { public partial class Form1 : Form { public Form1() { InitializeComponent(); } } }
Form1,前面的修飾都是跟類相關的,比如public partial class。還有Form1的構造方法等等,都是一個類基本擁有的寫法。僅僅只是由於繼承了基類 Form 。所以才有界面的顯示。
假設沒有了Form基類,你切換到設計器還能看得到界面嗎?
當我們刪除了Form基類。設計器就壓根兒不起作用了。
結論:不論什麽一個類,假設繼承了Form界面。他就能夠在設計器中展現出來。
PS:作為出色的程序猿。是不會依賴設計器的。而是須要通過代碼就能非常清楚。大概的界面應該是什麽樣子。
設計器能夠作為輔助。但不能成為依賴。
回過頭來,窗口傳值,事實上也就是類之間的傳值。
一般使用下面幾種:
- 構造函數的參數傳遞
- 公共成員變量
- 公開屬性
構造函數的參數傳遞
預計非常多人的代碼都以前有過下面片段
public class UserInfo { public UserInfo(int userId,string userName,int age,string nickName) { this.UserId = userId; this.Age = age; this.NickName = nickName; this.UserName = userName; } public int UserId { get; set; } public string UserName { get; set; } public int Age { get; set; } public string NickName { get; set; } }
這是一個實體類。有一個構造方法(函數)(咱要專業點,函數都叫做方法)
做過三層的人預計也都這樣用過吧。
UserInfo userInfo = new UserInfo(1, "username", 20, "昵稱"); BLLHelper.InsertUser(userInfo);
然後在InsertUser裏,就能夠拿到這些屬性的值。
同理,在強調一遍。Form is a class(窗口是一個類)
因此全部的操作都跟類同樣。
public partial class Form2 : Form { private string _name; public Form2(string name)//傳入一個參數 { InitializeComponent(); this._name = name;//_name變量接收值 } }
Form2 form = new Form2("名字"); form.Show();使用窗口須要實例化(使用類時須要實例化)
最後。Form2的_name變量就有傳過來的值了。
公共變量
什麽是公共變量?就是加了public修飾符的變量。
這種變量由於是public。因此該類被實例化後,public修飾的成員能夠被直接訪問。
但作者不推薦這麽做,至於為什麽嘛~百度吧,這個跟架構有關。
事實上非常easy,就剛才的Form2的代碼。把變量的修飾符改成public,然後就不須要構造方法裏傳參數了。
public string _name; public Form2() { InitializeComponent(); }
使用時
Form2 form = new Form2(); form._name = "名字"; form.Show();
公開屬性
什麽是屬性?自己百度吧。
那什麽又叫公開屬性呢?我們都知道屬性有get和set訪問器,可是這兩個訪問器是能夠加上訪問修飾符的,默認是public。依據自身的程序架構設計給訪問器設置不同的修飾符。比如僅僅可讀。不可寫的屬性。也就是你僅僅能通過這個屬性獲取值。但不能夠賦值等等,這裏不細說了。
通過屬性傳值,就好比你給實體類裏的那些字段賦值一樣。
public Form2() { InitializeComponent(); } public string Name { get; set; }
Form2 form = new Form2(); form.Name = "名字"; form.Show();
這樣的做法我最為推薦。
有人會問,這跟公開屬性有個毛的差別?
試問。假設你的set訪問器假設不是public的話。你能賦值嗎?
public Form2() { InitializeComponent(); } public bool Name { get; private set; }
我把set前面加了private
這個時候你來看Form1使用的代碼
所以,你的屬性沒有公開set,其它類是沒有辦法給它賦值的。
擴展知識
三種傳值方式我都說完了,如今擴展一下知識,在程序架構中。構造方法傳值和屬性傳值的優劣勢(public變量就不說了。性質跟屬性一樣,但不推薦使用。)
首先來說一下構造方法。
它會在類的實例化時被調用。假設遇到有參數,必須傳入對應參數,能夠理解成強制調用方法並傳入參數;
而屬性比較靈活,不是強制性的,通常是在須要的時候使用,你能夠理解成一種配置。
用一個實際點的樣例說話
public Form2(bool showControl) { if (showControl) { InitializeComponent(); } }
Form2 要求在使用時傳入一個值,這個值的作用是顯示控件,所以是強制性的。
Form2 form = new Form2(false);//表示不顯示 form.Show();
當我在實例化Form2時,強制性要傳入一個參數,由於Form2須要這個參數做下一步的動作。
假設是屬性的話
public Form2() { if (this.ShowControl) { InitializeComponent(); } } public bool ShowControl { get; set; }
Form2 form = new Form2();//我認為這裏不該顯示控件 form.Show(); // To do ...... form.ShowControl = true;//這裏須要顯示控件 form.Show();
我能夠在處理了一些事情以後選擇性的要求Form2是否要顯示控件。
有可能有些童鞋不太理解,主要是經驗不足啦,這沒關系。以後就會慢慢懂了,這也算是一種思路。慢慢地學會怎樣架構一套程序。
不知道我說清楚了沒有,歡迎拍磚!!
窗口間傳值的幾種方法