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

来源:https://www.cnblogs.com/arcticfish/archive/2020/02/12/12297675.html

引言: 窗體間傳值是每個學習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()方法。本例中測試可以,有知道原因的這裡請教一下各位。

 


您的分享是我們最大的動力!

更多相關文章
  • 一.匿名函數 1.定義:定義函數的時候不需要定義函數名 2.具體例子: #普通函數 def add(x,y): return x + y #匿名函數 lambda x,y: x + y 調用匿名函數: f = lambda x,y: x + y #賦值後可以調用 print(f(1,2) lambd ...
  • 最近在學習C和C++,除了在寫OS的時候用到外,寫演算法的時候也會用到,整理記錄C和C++讀取數據的各種方式。 [TOC] 文章較長,總結稍微詳細了一點。 c 輸出 printf() 在 中包含最經典的輸出函數 格式化輸出,在 中格式化輸出的格式: 1)類型 | 格式字元 | 含義 | | | | | ...
  • (使用前請將其命名為GC_servy.cpp,否則可能會出錯) #include<stdlib.h> #include<stdio.h> #include<time.h> //suiji #include<string.h> #include<windows.h> //SLEEP函數 #includ ...
  • 前言 從本篇開始將圍繞asp.net core身份驗證寫個小系列,希望你看完本系列後,腦子裡對asp.net core的身份驗證原理有個大致印象。至於身份驗證是啥?與授權有啥聯繫?就不介紹了,太啰嗦。你如果不曉得,自己去搜搜吧。我的學習思路是詳細看源碼 > 總結得出一個巨集觀上的印象 + 如何使用。如 ...
  • 下麵在 Web 空應用里展示一個簡單的例子來實現發送文本消息。 本文目錄: "創建 Web 空應用" "命令行方式創建" "添加SDK引用" "命令行方式" "進入項目目錄" + "添加包引用" "配置和使用SDK" "添加appsettings.Development.json文件" "修改Sta ...
  • 目錄 1.高性能RPC框架:Socean.RPC 2.Socean.RPC框架實測 簡介 這幾天給Socean.RPC加上了動態代理,簡稱EasyProxy,特點是性能高、穩定性好、使用簡便 使用入門: 服務端 : 1.定義序列化器和消息處理器 public class RpcSerializer ...
  • 一直在看java併發的感覺說的有點多,就看點簡單的放鬆一下吧!這次來簡單說一下jdk8,很久沒用,都陌生了,仔細看看還挺有意思的,讓我們大腦轉化一個角度來寫代碼;因為我們現在平常大部分用jdk7寫代碼,我們都是在想著這一步怎麼做,下一步怎麼做;而jdk8只需要知道這一步做什麼,下一步做什麼,思維的轉 ...
  • 一個多月了,新病毒還沒過去,今天開始上班了 過年哪都沒去,在家宅著打游戲看小說,偶爾寫寫代碼 自己做了一個人物的飛行道具的FBX,以前也做了一個但是沒用骨骼蒙皮 以前那個導到UE4裡面模型都飛了不知道為什麼 靜態網格模型和動畫骨骼模型混合的正確使用方法以後做場景的時候還要再仔細研究 自己的引擎沒有弄 ...
一周排行
  • 前幾天發佈了 "抄抄《CSS 故障藝術》的動畫" 這篇文章,在這篇文章里介紹瞭如何使用Win2D繪製文字然後配合BlendEffect製作故障藝術的動畫。本來打算就這樣收手不玩這個動畫了,但後來又發現性能不符合理想。明明只是做做Resize動畫和用BlendEffect混合,為什麼性能會這麼差呢? ...
  • 控制條控制項: progressBar 不能按照你程式的進程自動變化,需認為計算,調整變化量 private void progressBar1_Click(object sender, EventArgs e) { this.progressBar1.Maximum = 100;//設置進度條最大長 ...
  • 首先創建一個asp.net core web應用程式 第二步 目前官方預置了7種模板項目供我們選擇。從中我們可以看出,既有我們熟悉的MVC、WebAPI,又新添加了Razor Page,以及結合比較流行的Angular、React前端框架的模板項目。 空項目模板 Program.cs using S ...
  • 對閉包的理解 1.對於成員變數和局部變數:成員變數就是方法外部,類的內部定義的變數;局部變數就是方法或語句塊內部定義的變數。局部變數必須初始化。 形式參數是局部變數,局部變數的數據存在於棧記憶體中。棧記憶體中的局部變數隨著方法的消失而消失。成員變數存儲在堆中的對象裡面,由垃圾回收器負責回收。 成員變數它 ...
  • Xamarin.Forms讀取並展示Android和iOS通訊錄 TerminalMACS客戶端 本文同步更新地址: https://dotnet9.com/11520.html https://terminalmacs.com/861.html 閱讀導航: 一、功能說明 二、代碼實現 三、源碼獲取 ...
  • 做下對文件複製操作相關的筆記: /// <summary> /// 文件幫助類 /// </summary> public class FileHelper { /// <summary> /// 複製一個目錄下所有文件到一個新目錄下 /// </summary> /// <param name=" ...
  • 前言 有一個東西叫做鴨子類型,所謂鴨子類型就是,只要一個東西表現得像鴨子那麼就能推出這玩意就是鴨子。 C 裡面其實也暗藏了很多類似鴨子類型的東西,但是很多開發者並不知道,因此也就沒法好好利用這些東西,那麼今天我細數一下這些藏在編譯器中的細節。 不是只有 和 才能 在 C 中編寫非同步代碼的時候,我們經 ...
  • [toc] 1.應用背景 底端設備有大量網路報文(位元組數組):心跳報文,數據採集報文,告警報文上報。需要有對應的報文結構去解析這些位元組流數據。 2.結構體解析 由此,我第一點就想到了用結構體去解析。原因有以下兩點: 2.1.結構體存在棧中 類屬於引用類型,存在堆中;結構體屬於值類型,存在棧中,在一個 ...
  • 《深入淺出 C#》 (第3版) [作者] (美) Andrew Stellman (美) Jennifer Greene[譯者] (中) 徐陽 丁小峰 等譯[出版] 中國電力出版社[版次] 2016年08月 第1版[印次] 2018年04月 第4次 印刷[定價] 148.00元 【引子】 要學習編程 ...
  • 記錄使用對象初始值設定項初始化對象。 using System; using System.Collections.Generic; namespace ConsoleApp2 { class Program { static void Main(string[] args) { // 使用構造函數 ...
x