本文實例講述了c#窗體傳值用法。分享給大家供大家參考。具體分析如下:
對於窗體間的數據傳遞,是剛開始從事.Net窗體應用程序開發人員碰到的一個常見問題,在此講幾個常見的實現方式。此節內容適用於模式窗體或非模式窗體,部分方式延伸到一般類的操作。
(1)構造函數參數傳遞
通過構造函數傳遞參數應該是比較基本的參數傳遞方式,重載構造函數,通過帶參數的構造函數來實例化窗體。
在窗體類內部定義參數變量,
private object myParams;
實現構造函數,
?
1 2 3 4 5 public OptionForm(object parameters) { InitializeComponent(); this.myParams = parameters;//設置參數引用 }實例化窗體,
OptionForm form = new OptionForm( myParams );
在實際使用過程中,需要注意傳入的是引用類型還是值類型,處理方式會有所不同。
(2)使用窗體的屬性
說起屬性關聯,上面已經提到過Form.Owner屬性,下面筆者根據MSDN文檔來比較完整的講一下,大部分的文字來自MSDN文檔,為保證其完整性,對其中一些屬性描述進行了擴展。
Form.Owner 屬性。獲取或設置擁有此窗體的窗體。
語法,public Form Owner { get; set; }
若要使某窗體歸另一個窗體所有,可為其 Owner 屬性分配一個對將成為所有者的窗體的引用。當一個窗體歸另一窗體所有時,它便隨著所有者窗體最小化和關閉。例如,如果 Form2 歸窗體 Form1 所有,則關閉或最小化 Form1 時,Form2 也會關閉或最小化。並且附屬窗體從不顯示在其所有者窗體後面。可以將附屬窗體用於查找和替換窗口之類的窗口,當選定所有者窗體時,這些窗口不應消失。
Form.OwnedForms 屬性。獲取 Form 對象的數組,這些對象表示此窗體擁有的所有窗體。
語法,public Form[] OwnedForms { get; }
此屬性返回包含此窗體擁有的所有窗體的數組。要使某窗體歸另一個窗體所有,可調用 AddOwnedForm 方法。分配給所有者窗體的窗體將保持被擁有狀態,直到調用了 RemoveOwnedForm 方法。如果窗體是多文檔界面 (MDI) 父窗體,則除了當前打開的所有 MDI 子窗體外,此屬性將返回所有顯示的窗體。
Form.MdiChildren 屬性。獲取窗體的數組,這些窗體表示以此窗體作為父級的多文檔界面 (MDI) 子窗體。
語法,public Form[] MdiChildren { get; }
此屬性使您得以獲取對當前在某 MDI 父窗體中打開的所有 MDI 子窗體的引用。若要創建 MDI 子窗體,請將要成為 MDI 父窗體的 Form 分配給該子窗體的 MdiParent 屬性。可以使用此屬性依次通過所有 MDI 子窗體,以執行一些操作,如當 MDI 父窗體關閉時將數據保存到數據庫中,或者根據應用程序中執行的操作更新子窗體上的字段。
Form.MdiParent 屬性。獲取或設置此窗體的當前多文檔界面 (MDI) 父窗體。
語法,public Form MdiParent { get; set; }
若要創建 MDI 子窗體,請將要成為 MDI 父窗體的 Form 分配給該子窗體的 MdiParent 屬性。可以從某 MDI 子窗體使用此屬性來獲取所有子窗體都需要的全局信息或者調用對所有子窗體執行操作的方法。
Form.ActiveForm 靜態屬性。獲取此應用程序的當前活動窗體。
語法,public static Form ActiveForm { get; }
表示當前活動窗體,或者如果沒有活動窗體,則為空引用。可以使用此方法獲得對當前活動窗體的引用,以在該窗體或其控件上執行操作。
Form.ActiveMdiChild 屬性。獲取當前活動的多文檔界面 (MDI) 子窗口。
語法,public Form ActiveMdiChild { get; }
返回表示當前活動的 MDI 子窗口的 Form,或者如果當前沒有子窗口,則返回 空引用。可使用此方法確定 MDI 應用程序中是否有任何打開的 MDI 子窗體。也可使用此方法從 MDI 子窗口的 MDI 父窗體或者從應用程序中顯示的其他窗體對該 MDI 子窗口執行操作。
ContainerControl.ParentForm 屬性。獲取將容器控件分配給的窗體。
語法,public Form ParentForm { get; }
將容器控件分配給的 Form。
(3)使用公共屬性(念時注:我比較常用這種方式)
使用公共屬性也是一種比較常用的方式,通過窗體設計器添加的控件默認訪問修飾符為private級別,可以設置成public或Internal(在程序集內部可見)來對外公開。比如對窗體中的Button進行公開,那就可以訪問Button的相關屬性,同時也可以注冊事件或撤銷事件注冊。如:OptionForm form = new OptionForm();
?
1 2 form.buttonOK.Click += new EventHandler(buttonOK_Click); form.ShowDialog();對於只允許讀取訪問或修改訪問的控件或變量可以通過屬性來控制。對(1)方式進行修改,去除重載構造函數,增加屬性也可以實現同樣的效果。
?
1 2 3 4 5 public object MyParams { get { return this.myParams; } set { this.myParams = value; } }(4)使用公共方法
使用公共方法類似於屬性,對上面的同等實現如下,
?
1 2 3 4 5 6 7 8 9 10 //獲取參數 public object GetParams() { return this.myParams; } //設置參數 public void SetParams(object myParams ) { this.myParams = myParams; }(5)使用靜態類該方式可以簡單的理解為靜態變量全局共享,通過下面代碼能夠比較清楚的理解,先來定義靜態類,
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public static class ParameterSettings { //公共靜態變量 public static string Username = "Zhengzuo"; //私有靜態變量 private static string userRole = "Administrators"; //私有靜態變量 private static string password = "http://www.3lian.net/"; //內部屬性 internal static string UserRole { get { return userRole; } } //公共屬性 public static string Password { get { return password; } private set { password = value; } } }在需要訪問的地方通過以下方式進行:
?
1 2 3 4 string username = ParameterSettings.Username; string password = ParameterSettings.Password; string userRole = ParameterSettings.UserRole; ParameterSettings.Username = "鄭佐";//修改成新用戶名(6)窗體實現Singleton模式
Singleton模式是我們開發過程中最常用的模式之一。在技術社區經常看到有人談及對主窗體實現Singleton,但個人認為這不是一種妥當的做法,因為沒有這個必要。這裡通過另一個自定義類來進行演示。假設UserLoginInfo類用來保存登錄系統後的用戶憑據。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2