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裡面模型都飛了不知道為什麼 靜態網格模型和動畫骨骼模型混合的正確使用方法以後做場景的時候還要再仔細研究 自己的引擎沒有弄 ...
一周排行
  • 1. 雲停車 (開篇)2. 雲停車 (硬體篇)3. 雲停車 (業務篇)4. 雲停車 (平臺篇)5. 雲停車 (源碼篇) 網址:http://42.194.142.223:8091/Home 賬戶:admin 密碼:[email protected] 在場記錄 出入記錄 月租車繳費記錄 臨時車繳費記錄 車場 ...
  • 1.RabbitMQ簡介 因為RabbitMQ是基於開源的AMQP協議來實現的,所以在瞭解MQ時候,首先我們來瞭解下AMQP協議。AMQP,即Advanced Message Queuing Protocol,一個提供統一消息服務的應用層標準高級消息隊列協議,是應用層協議的一個開放標準,為面向消息的 ...
  • 1.AMQP Messaging中的基本概念 Broker:接收和分發消息的應用,RabbitMQ Server就是Message Broker。Virtual Host:出於多租戶和安全因素設計的,把AMQP的基本組件劃分到一個虛擬的分組中,類似於網路中的Namespace概念。當多個不同的用戶使 ...
  • 在顯示或者隱藏視窗的時候,可以利用Windows API中的AnimateWindow函數實現一些特殊的效果。主要的動畫類型有四種:滾動、幻燈片、摺疊或展開和alpha混合漸變。 ##視窗動畫效果 首先定義動畫工具類,引入AnimateWindow函數。 public class WindowsEf ...
  • 泥水佬大佬的地址已經不能下載,所以分享下。 用法很簡單,輸入地址即可。 鏈接:https://pan.baidu.com/s/1OUeybjqY9uGWmxe_ywgwgQ 提取碼:nls9 ...
  • //前提需要 //需要一個 serialPort 工具 可在vs自帶的工具欄中獲得 //源代碼加串口工具地址: //鏈接:https://pan.baidu.com/s/1YbfvdXEmfsJX87D-Jxljyg 提取碼:d32x //記錄用戶打開的串口號 可改為泛型模式 string seri ...
  • 從業務視角還原問題、業務視角抽象問題、二次抽象發現技術問題,作為思考問題的三個還原點。 提煉單點問題解決能力、思考單點問題解決能力,複製、層層遞進思考問題,從深度和廣度出發, 深度以數據作指標,廣度以領域做方向。 腳踏實地的代碼量成長沒有捷徑。 ...
  • Java電子書分類 Java、Spring、SpringBoot、SpringCloud、mybatis、Tomcat、多線程、Git相關、Redis、設計模式、Nginx、Linux、演算法、資料庫、大數據、架構 電子書大概有30G左右 部分電子書截圖 領取方式 加我的微信(s2001sssss)免 ...
  • 一.node啟動js公鑰加密 //需要導入模塊npm install node-forge var arguments = process.argv.splice(2); // console.log('所傳遞的參數是:', arguments); var e = arguments[1]; var ...
  • LeetCode–最長公共首碼 博客說明 文章所涉及的資料來自互聯網整理和個人總結,意在於個人學習和經驗彙總,如有什麼地方侵權,請聯繫本人刪除,謝謝! 說明 leetcode題,14題 最長公共首碼 題目 編寫一個函數來查找字元串數組中的最長公共首碼。 如果不存在公共首碼,返回空字元串 ""。 示例 ...