C# 利用委託事件進行窗體間的傳值(新手必看)

引言:安全

  窗體間傳值是每一個學習WinForm新手的常見問題,最初級的方法就是 在窗體中先獲取到要接受值窗體。而後經過.獲得某個空間或者屬性,直接賦值,這個須要接收放的窗體屬性或者空間必須是public ,是極不安全的一種方式。在升級一下的新手作法就是在接受窗體中定義一個方法而後經過 調用這個方法來給某個控件或者屬性賦值。這兩種方法都是非安全的低級方式。很是不建議使用。本文咱們講講如何經過委託事件(非單純的委託)來解決窗體間信息傳遞的問題。學習

場景:測試

               經過點擊主主窗體From_Main的發送按鈕,全部子窗體中顯示出發送的內容,以下圖this

 

 

學習前提:orm

               對委託有初步瞭解。若是你對委託一點不瞭解,建議先看一下本人前一篇關於委託的基礎介紹文章。blog

正文:事件

第1步:定一個委託 字符串

代碼:string

      public delegate void SendMessageToChildForms(string s); //定義了一個參數是string ,無返回值的委託,名爲SendMessageToChildForms。io

說明:1.他能夠定義在項目中任何能夠被訪問到的地方(如主窗體,某一個子窗體,或者一個類) 。但原則上定義在一直存在的窗體中,本例在主窗體中的命名空間標題下。

          2.系統內置了兩個定義好的委託類型 Action 和Func ,你也能夠直接省略這一步。在第3步實例化他就能夠了。其中Action是無返回值的委託,Func是帶返回值的委託。他們的輸入參個數數都是0~16個。

第2步:實例化一個此委託類型的事件

代碼:

    public event SendMessageToChildForms smtcf_event; 

說明:1.能夠省略event ,public有時也不寫,就能夠簡寫成 SendMessageToChildForms smtcf;不利於新手理解,其實他本質就是實例化了一個事件event

   2.若是咱們使用了微軟內置的委託類型Action或者Func 則能夠寫成這樣 public event Action<string> SendMessageToChildForms;  這裏string 必需要寫,由於沒有第1步因此這裏須要指明參數列表。

           3.委託與委託事件的關係,本例中使用了委託事件 ,相對於委託更安全。更低耦合。委託是一個類型,例如SendMessageToChildForms類,事件是委託類型的一個實例 如smtcf_event。

第3步:定義具體執行的方法 

代碼:

public void ToShowGetMessage(string s)
{
     this.lb_收到內容.Text=s;
}

說明:1.具體的功能方法,這裏那個窗體須要執行就寫在哪一個窗體裏,好比本例是更新子窗體的顯示,因此寫到子窗體裏,若是換成另外一場景:子窗體中刪除了當前這條信息,須要更新,那麼就定義到主窗體中 

           2.方法的參數列表及返回類型必須與委託徹底一致。好比本例,參數列表是一個string消息字符串,返回類型是void空,方法必須是public;

第4步:方法綁定到委託上

代碼: 

Form_Child frm_child = new Form_Child();
smtcf_event+= new SendMessageToChildForms(frm_child.ToShowGetMessage); //在一實例化的一個委託事件上綁定子窗體的具體方法
frm_child.Show();

Form_Child frm_child2 = new Form_Child();
smtcf_event+= new SendMessageToChildForms(frm_child2.ToShowGetMessage); //在一實例化的一個委託事件上綁定子窗體的具體方法
frm_child2.Show();

注意:1.把要執行的方法在新窗體初始化時綁定到他裏面定義好的委託類型事件上,必需要在子窗體Show()時間以前

           2.一個委託事件smtcf 能夠綁定多個方法。

第5步:觸發委託

代碼:

//委託第5步:觸發委託
if (smtcf_event!= null) //判斷委託事件是否爲空,若是委託不爲空才執行
{
smtcf_event.Invoke(this.textBox1.Text.Trim());// 能夠省略Invoke 簡寫爲smtcf(this.textBox1.Text.Trim());
}

說明:1.必須首先判斷一下委託事件smtcf是否爲空。再執行;

      2.通常 簡寫爲smtcf_event(this.textBox1.Text.Trim());

          3.網上有人說委託事件smtcf_event不能直接調用Invoke()方法。本例中測試能夠,有知道緣由的這裏請教一下各位。

相關文章
相關標籤/搜索