1. 程式人生 > >窗口間傳值的幾種方法

窗口間傳值的幾種方法

sdn 架構設計 基本 popu 問題 剛才 text src 界面

剛開始學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的構造方法裏加一個參數,再聲明一個變量接收


            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是否要顯示控件。


有可能有些童鞋不太理解,主要是經驗不足啦,這沒關系。以後就會慢慢懂了,這也算是一種思路。慢慢地學會怎樣架構一套程序。

不知道我說清楚了沒有,歡迎拍磚!!

技術分享

窗口間傳值的幾種方法