引言: 窗體間傳值是每個學習WinForm新手的常見問題,最初級的方法就是 在窗體中先獲取到要接受值窗體。然後通過.得到某個空間或者屬性,直接賦值,這個需要接收放的窗體屬性或者空間必須是public ,是極不安全的一種方式。在升級一下的新手做法就是在接受窗體中定義一個方法然後通過 調用這個方法來給某 ...
引言:
窗體間傳值是每個學習WinForm新手的常見問題,最初級的方法就是 在窗體中先獲取到要接受值窗體。然後通過.得到某個空間或者屬性,直接賦值,這個需要接收放的窗體屬性或者空間必須是public ,是極不安全的一種方式。在升級一下的新手做法就是在接受窗體中定義一個方法然後通過 調用這個方法來給某個控制項或者屬性賦值。這兩種方法都是非安全的低級方式。非常不建議使用。本文我們講講如何通過委托事件(非單純的委托)來解決窗體間信息傳遞的問題。
場景:
通過點擊主主窗體From_Main的發送按鈕,所有子窗體中顯示出發送的內容,如下圖
學習前提:
對委托有初步瞭解。如果你對委托一點不瞭解,建議先看一下本人前一篇關於委托的基礎介紹文章。
正文:
第1步:定一個委托
代碼:
public delegate void SendMessageToChildForms(string s); //定義了一個參數是string ,無返回值的委托,名為SendMessageToChildForms。
說明: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()方法。本例中測試可以,有知道原因的這裡請教一下各位。