国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
c#窗體傳值 - 春哥也編程 - 博客園

c#窗體傳值

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

(1)構(gòu)造函數(shù)參數(shù)傳遞
通過(guò)構(gòu)造函數(shù)傳遞參數(shù)應(yīng)該是比較基本的參數(shù)傳遞方式,重載構(gòu)造函數(shù),通過(guò)帶參數(shù)的構(gòu)造函數(shù)來(lái)實(shí)例化窗體。
在窗體類內(nèi)部定義參數(shù)變量,
private object myParams;

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

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

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

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

Form.Owner 屬性。獲取或設(shè)置擁有此窗體的窗體。
語(yǔ)法,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)閉或最小化。并且附屬窗體從不顯示在其所有者窗體后面??梢詫⒏綄俅绑w用于查找和替換窗口之類的窗口,當(dāng)選定所有者窗體時(shí),這些窗口不應(yīng)消失。
Form.OwnedForms 屬性。獲取 Form 對(duì)象的數(shù)組,這些對(duì)象表示此窗體擁有的所有窗體。
語(yǔ)法,public Form[] OwnedForms { get; }
此屬性返回包含此窗體擁有的所有窗體的數(shù)組。要使某窗體歸另一個(gè)窗體所有,可調(diào)用 AddOwnedForm 方法。分配給所有者窗體的窗體將保持被擁有狀態(tài),直到調(diào)用了 RemoveOwnedForm 方法。如果窗體是多文檔界面 (MDI) 父窗體,則除了當(dāng)前打開(kāi)的所有 MDI 子窗體外,此屬性將返回所有顯示的窗體。
Form.MdiChildren 屬性。獲取窗體的數(shù)組,這些窗體表示以此窗體作為父級(jí)的多文檔界面 (MDI) 子窗體。
語(yǔ)法,public Form[] MdiChildren { get; }
此屬性使您得以獲取對(duì)當(dāng)前在某 MDI 父窗體中打開(kāi)的所有 MDI 子窗體的引用。若要?jiǎng)?chuàng)建 MDI 子窗體,請(qǐng)將要成為 MDI 父窗體的 Form 分配給該子窗體的 MdiParent 屬性??梢允褂么藢傩砸来瓮ㄟ^(guò)所有 MDI 子窗體,以執(zhí)行一些操作,如當(dāng) MDI 父窗體關(guān)閉時(shí)將數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中,或者根據(jù)應(yīng)用程序中執(zhí)行的操作更新子窗體上的字段。
Form.MdiParent 屬性。獲取或設(shè)置此窗體的當(dāng)前多文檔界面 (MDI) 父窗體。
語(yǔ)法,public Form MdiParent { get; set; }
若要?jiǎng)?chuàng)建 MDI 子窗體,請(qǐng)將要成為 MDI 父窗體的 Form 分配給該子窗體的 MdiParent 屬性??梢詮哪?MDI 子窗體使用此屬性來(lái)獲取所有子窗體都需要的全局信息或者調(diào)用對(duì)所有子窗體執(zhí)行操作的方法。
Form.ActiveForm 靜態(tài)屬性。獲取此應(yīng)用程序的當(dāng)前活動(dòng)窗體。
語(yǔ)法,public static Form ActiveForm { get; }
表示當(dāng)前活動(dòng)窗體,或者如果沒(méi)有活動(dòng)窗體,則為空引用??梢允褂么朔椒ǐ@得對(duì)當(dāng)前活動(dòng)窗體的引用,以在該窗體或其控件上執(zhí)行操作。
Form.ActiveMdiChild 屬性。獲取當(dāng)前活動(dòng)的多文檔界面 (MDI) 子窗口。
語(yǔ)法,public Form ActiveMdiChild { get; }
返回表示當(dāng)前活動(dòng)的 MDI 子窗口的 Form,或者如果當(dāng)前沒(méi)有子窗口,則返回 空引用??墒褂么朔椒ù_定 MDI 應(yīng)用程序中是否有任何打開(kāi)的 MDI 子窗體。也可使用此方法從 MDI 子窗口的 MDI 父窗體或者從應(yīng)用程序中顯示的其他窗體對(duì)該 MDI 子窗口執(zhí)行操作。
ContainerControl.ParentForm 屬性。獲取將容器控件分配給的窗體。
語(yǔ)法,public Form ParentForm { get; }
將容器控件分配給的 Form。

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

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

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

(5)使用靜態(tài)類該方式可以簡(jiǎn)單的理解為靜態(tài)變量全局共享,通過(guò)下面代碼能夠比較清楚的理解,先來(lá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";
    //內(nèi)部屬性
    internal static string UserRole
    {
        get { return userRole; }
    }
    //公共屬性
    public static string Password
    {
        get { return password; }
        private set { password = value; }
    }
}

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

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

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

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

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

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

對(duì)文件目錄選擇按鈕事件處理程序進(jìn)行修改來(lái)實(shí)現(xiàn)事件激發(fā),并沒(méi)有考慮直接從文本框直接數(shù)據(jù)輸入方式。
//通過(guò)目錄對(duì)話框設(shè)置新的路徑
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);
        }
    }
}
好了,一切準(zhǔn)備工作完成,調(diào)用代碼如下,
OptionForm form = new OptionForm();
//注冊(cè)事件
form.OptionSettingChanged += new EventHandler(form_OptionSettingChanged);
form.ShowDialog();
通過(guò)以下事件處理程序來(lái)驗(yàn)證其正確性,
private void form_OptionSettingChanged(object sender, OptionSettingEventArgs e)
{
    string newPath = e.ChangedPath;
    MessageBox.Show(this, String.Format("新路徑為“{0}”。", newPath), "提示");
}

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
常見(jiàn)傳值方式收集
05、C#--Winform(一)
Winform窗體間傳值
c# 類操作 窗體
【C#控件】MenuStrip控件(菜單控件)
代碼生成器開(kāi)發(fā)筆記(3)-界面設(shè)計(jì)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服