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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c#窗体传值

發(fā)布時間:2024/6/5 C# 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c#窗体传值 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

(1)構造函數(shù)參數(shù)傳遞
通過構造函數(shù)傳遞參數(shù)應該是比較基本的參數(shù)傳遞方式,重載構造函數(shù),通過帶參數(shù)的構造函數(shù)來實例化窗體。
在窗體類內部定義參數(shù)變量,
private object myParams;

實現(xiàn)構造函數(shù),
public OptionForm(object parameters)
{
? ? InitializeComponent();
? ? this.myParams = parameters;//設置參數(shù)引用
}

實例化窗體,
OptionForm form = new OptionForm( myParams );

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

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

Form.Owner 屬性。獲取或設置擁有此窗體的窗體。
語法,public Form Owner { get; set; }
若要使某窗體歸另一個窗體所有,可為其 Owner 屬性分配一個對將成為所有者的窗體的引用。當一個窗體歸另一窗體所有時,它便隨著所有者窗體最小化和關閉。例如,如果 Form2 歸窗體 Form1 所有,則關閉或最小化 Form1 時,Form2 也會關閉或最小化。并且附屬窗體從不顯示在其所有者窗體后面。可以將附屬窗體用于查找和替換窗口之類的窗口,當選定所有者窗體時,這些窗口不應消失。
Form.OwnedForms 屬性。獲取 Form 對象的數(shù)組,這些對象表示此窗體擁有的所有窗體。
語法,public Form[] OwnedForms { get; }
此屬性返回包含此窗體擁有的所有窗體的數(shù)組。要使某窗體歸另一個窗體所有,可調用 AddOwnedForm 方法。分配給所有者窗體的窗體將保持被擁有狀態(tài),直到調用了 RemoveOwnedForm 方法。如果窗體是多文檔界面 (MDI) 父窗體,則除了當前打開的所有 MDI 子窗體外,此屬性將返回所有顯示的窗體。
Form.MdiChildren 屬性。獲取窗體的數(shù)組,這些窗體表示以此窗體作為父級的多文檔界面 (MDI) 子窗體。
語法,public Form[] MdiChildren { get; }
此屬性使您得以獲取對當前在某 MDI 父窗體中打開的所有 MDI 子窗體的引用。若要創(chuàng)建 MDI 子窗體,請將要成為 MDI 父窗體的 Form 分配給該子窗體的 MdiParent 屬性。可以使用此屬性依次通過所有 MDI 子窗體,以執(zhí)行一些操作,如當 MDI 父窗體關閉時將數(shù)據(jù)保存到數(shù)據(jù)庫中,或者根據(jù)應用程序中執(zhí)行的操作更新子窗體上的字段。
Form.MdiParent 屬性。獲取或設置此窗體的當前多文檔界面 (MDI) 父窗體。
語法,public Form MdiParent { get; set; }
若要創(chuàng)建 MDI 子窗體,請將要成為 MDI 父窗體的 Form 分配給該子窗體的 MdiParent 屬性。可以從某 MDI 子窗體使用此屬性來獲取所有子窗體都需要的全局信息或者調用對所有子窗體執(zhí)行操作的方法。
Form.ActiveForm 靜態(tài)屬性。獲取此應用程序的當前活動窗體。
語法,public static Form ActiveForm { get; }
表示當前活動窗體,或者如果沒有活動窗體,則為空引用。可以使用此方法獲得對當前活動窗體的引用,以在該窗體或其控件上執(zhí)行操作。
Form.ActiveMdiChild 屬性。獲取當前活動的多文檔界面 (MDI) 子窗口。
語法,public Form ActiveMdiChild { get; }
返回表示當前活動的 MDI 子窗口的 Form,或者如果當前沒有子窗口,則返回 空引用。可使用此方法確定 MDI 應用程序中是否有任何打開的 MDI 子窗體。也可使用此方法從 MDI 子窗口的 MDI 父窗體或者從應用程序中顯示的其他窗體對該 MDI 子窗口執(zhí)行操作。
ContainerControl.ParentForm 屬性。獲取將容器控件分配給的窗體。
語法,public Form ParentForm { get; }
將容器控件分配給的 Form。

(3)使用公共屬性(念時注:我比較常用這種方式)
使用公共屬性也是一種比較常用的方式,通過窗體設計器添加的控件默認訪問修飾符為private級別,可以設置成public或Internal(在程序集內部可見)來對外公開。比如對窗體中的Button進行公開,那就可以訪問Button的相關屬性,同時也可以注冊事件或撤銷事件注冊。如,
OptionForm form = new OptionForm();
form.buttonOK.Click += new EventHandler(buttonOK_Click);
form.ShowDialog();

對于只允許讀取訪問或修改訪問的控件或變量可以通過屬性來控制。對(1)方式進行修改,去除重載構造函數(shù),增加屬性也可以實現(xiàn)同樣的效果。
public object MyParams
{
? ? get { return this.myParams;? }
? ? set { this.myParams = value;? }
}

(4)使用公共方法
使用公共方法類似于屬性,對上面的同等實現(xiàn)如下,
//獲取參數(shù)
public object GetParams()
{
? ? return this.myParams;
}
//設置參數(shù)
public void SetParams(object myParams )
{
? ? this.myParams = myParams;
}

(5)使用靜態(tài)類該方式可以簡單的理解為靜態(tài)變量全局共享,通過下面代碼能夠比較清楚的理解,先來定義靜態(tài)類,
public static class ParameterSettings
{
? ? //公共靜態(tài)變量
? ? public static string Username = "Zhengzuo";
? ? //私有靜態(tài)變量
? ? private static string userRole = "Administrators";
? ? //私有靜態(tài)變量
? ? private static string password = "http://blog.csdn.net/zhzuo";
? ? //內部屬性
? ? internal static string UserRole
? ? {
? ? ? ? get { return userRole; }
? ? }
? ? //公共屬性
? ? public static string Password
? ? {
? ? ? ? get { return password; }
? ? ? ? private set { password = value; }
? ? }
}

在需要訪問的地方通過以下方式進行,
string username = ParameterSettings.Username;
string password = ParameterSettings.Password;
string userRole = ParameterSettings.UserRole;
ParameterSettings.Username = "鄭佐";//修改成新用戶名

(6)窗體實現(xiàn)Singleton模式
Singleton模式是我們開發(fā)過程中最常用的模式之一。在技術社區(qū)經常看到有人談及對主窗體實現(xiàn)Singleton,但個人認為這不是一種妥當?shù)淖龇?#xff0c;因為沒有這個必要。這里通過另一個自定義類來進行演示。假設UserLoginInfo類用來保存登錄系統(tǒng)后的用戶憑據(jù)。
/*==============================================
程序 鄭佐 2006-4-23 http://blog.csdn.net/zhzuo
==============================================*/
public class UserLoginInfo
{
? ? //實現(xiàn)Singleton模式,線程安全。
? ? private readonly static UserLoginInfo currentUserInfo = new UserLoginInfo();
? ? //提供全局訪問點
? ? public static UserLoginInfo CurrentUserInfo
? ? {
? ? ? ? get { return currentUserInfo; }
? ? }
? ? //阻止顯式實例化,但不能阻止反射方式調用。
? ? private UserLoginInfo()
? ? {
? ? }
? ? //公共變量
? ? public string Username;
? ? //私有變量
? ? private static string userRole;
? ? //私有變量
? ? private static string password;
? ? //內部屬性
? ? internal string UserRole
? ? {
? ? ? ? get { return userRole; }
? ? ? ? set { userRole = value; }
? ? }
? ? //公共屬性
? ? public string Password
? ? {
? ? ? ? get { return password; }
? ? ? ? internal set { password = value; }
? ? }
}

在其他代碼中進行訪問,
UserLoginInfo.CurrentUserInfo.Username ="鄭佐";
UserLoginInfo.CurrentUserInfo.UserRole = "dotnetlover";
UserLoginInfo.CurrentUserInfo.Password = "http://blog.csdn.net/zhzuo";

對于Singleton模式的實現(xiàn)方式有很多,編寫時需要考慮是否需要保證實例訪問的線程安全問題,以免引發(fā)不可預料的情況,為了提高性能可以考慮惰性實例化。關于Singleton模式的更多信息可以參考另一篇文章。

(7)發(fā)布事件進行訂閱
通過事件來傳遞參數(shù)應該說是一種推的實現(xiàn)方式,在產生事件時進行被動的獲取相關數(shù)據(jù)。這里將通過一個自定義事件來演示數(shù)據(jù)的傳輸。
在自定義事件時,標準的做法都會先定義一個事件參數(shù)類,要么直接使用基類EventArgs,或者從EventArgs繼承實現(xiàn)自己的參數(shù)類,假設自定義基類取名為OptionSettingEventArgs,
//選項設置事件參數(shù)類
public class OptionSettingEventArgs : EventArgs
{
? ? private string changedPath;
? ? //構造函數(shù)
? ? public OptionSettingEventArgs(string changedPath)
? ? {
? ? ? ? this.changedPath = changedPath;
? ? }
? ? //讀取參數(shù)
? ? public string ChangedPath
? ? {
? ? ? ? get { return this.changedPath; }
? ? }
}

以上參數(shù)類只包含一個修改后的路徑參數(shù)。接下去我們要對原先的OptionForm窗體增加事件定義,這里使用.net 2.0中提供的泛型類來實現(xiàn)。
//定義事件
public event EventHandler<OptionSettingEventArgs> OptionSettingChanged;
編寫事件引發(fā)程序如下,
//引發(fā)OptionSettingChanged事件
protected virtual void OnOptionSettingChanged(OptionSettingEventArgs e)
{
? ? if (OptionSettingChanged != null)
? ? {
? ? ? ? OptionSettingChanged(this, e);
? ? }
}

對文件目錄選擇按鈕事件處理程序進行修改來實現(xiàn)事件激發(fā),并沒有考慮直接從文本框直接數(shù)據(jù)輸入方式。
//通過目錄對話框設置新的路徑
private void buttonBrowser_Click(object sender, EventArgs e)
{
? ? FolderBrowserDialog dialog = new FolderBrowserDialog();
? ? DialogResult result = dialog.ShowDialog(this);
? ? if (result == DialogResult.OK)
? ? {
? ? ? ? if(this.textBoxPath.Text != dialog.SelectedPath)
? ? ? ? {
? ? ? ? ? ? this.textBoxPath.Text = dialog.SelectedPath;
? ? ? ? ? ? OptionSettingEventArgs args = new OptionSettingEventArgs(dialog.SelectedPath);
? ? ? ? ? ? OnOptionSettingChanged(args);
? ? ? ? }
? ? }
}
好了,一切準備工作完成,調用代碼如下,
OptionForm form = new OptionForm();
//注冊事件
form.OptionSettingChanged += new EventHandler (form_OptionSettingChanged);
form.ShowDialog();
通過以下事件處理程序來驗證其正確性,
private void form_OptionSettingChanged(object sender, OptionSettingEventArgs e)
{
? ? string newPath = e.ChangedPath;
? ? MessageBox.Show(this, String.Format("新路徑為“{0}”。", newPath), "提示");
}

轉載于:https://www.cnblogs.com/zcy_soft/archive/2010/07/24/1784115.html

總結

以上是生活随笔為你收集整理的c#窗体传值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。