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

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

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

 


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

-Advertisement-
Play Games
更多相關文章
  • 一.匿名函數 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裡面模型都飛了不知道為什麼 靜態網格模型和動畫骨骼模型混合的正確使用方法以後做場景的時候還要再仔細研究 自己的引擎沒有弄 ...
一周排行
    -Advertisement-
    Play Games
  • JWT(JSON Web Token)是一種用於在網路應用之間傳遞信息的開放標準(RFC 7519)。它使用 JSON 對象在安全可靠的方式下傳遞信息,通常用於身份驗證和信息交換。 在Web API中,JWT通常用於對用戶進行身份驗證和授權。當用戶登錄成功後,伺服器會生成一個Token並返回給客戶端 ...
  • 老周在幾個世紀前曾寫過樹莓派相關的 iOT 水文,之所以沒寫 Nano Framework 相關的內容,是因為那時候這貨還不成熟,可玩性不高。不過,這貨現在已經相對完善,老周都把它用在項目上了——第一個是自製的智能插座,這個某寶上50多塊可以買到,搜“esp32 插座”就能找到。一種是 86 型盒子 ...
  • 引言 上一篇我們創建了一個Sample.Api項目和Sample.Repository,並且帶大家熟悉了一下Moq的概念,這一章我們來實戰一下在xUnit項目使用依賴註入。 Xunit.DependencyInjection Xunit.DependencyInjection 是一個用於 xUnit ...
  • 在 Avalonia 中,樣式是定義控制項外觀的一種方式,而控制項主題則是一組樣式和資源,用於定義應用程式的整體外觀和感覺。本文將深入探討這些概念,並提供示例代碼以幫助您更好地理解它們。 樣式是什麼? 樣式是一組屬性,用於定義控制項的外觀。它們可以包括背景色、邊框、字體樣式等。在 Avalonia 中,樣 ...
  • 在處理大型Excel工作簿時,有時候我們需要在工作表中凍結窗格,這樣可以在滾動查看數據的同時保持某些行或列固定不動。凍結窗格可以幫助我們更容易地導航和理解複雜的數據集。相反,當你不需要凍結窗格時,你可能需要解凍它們以獲得完整的視野。 下麵將介紹如何使用免費.NET庫通過C#實現凍結Excel視窗以鎖 ...
  • .NET 部署 IIS 的簡單步驟一: 下載 dotnet-hosting-x.y.z-win.exe ,下載地址:.NET Downloads (Linux, macOS, and Windows) (microsoft.com) .NET 部署 IIS 的簡單步驟二: 選擇對應的版本,點擊進入詳 ...
  • 拓展閱讀 資料庫設計工具-08-概覽 資料庫設計工具-08-powerdesigner 資料庫設計工具-09-mysql workbench 資料庫設計工具-10-dbdesign 資料庫設計工具-11-dbeaver 資料庫設計工具-12-pgmodeler 資料庫設計工具-13-erdplus ...
  • 初識STL STL,(Standard Template Library),即"標準模板庫",由惠普實驗室開發,STL中提供了非常多對信息學奧賽很有用的東西。 vector vetor是STL中的一個容器,可以看作一個不定長的數組,其基本形式為: vector<數據類型> 名字; 如: vector ...
  • 前言 最近自己做了個 Falsk 小項目,在部署上伺服器的時候,發現雖然不乏相關教程,但大多都是將自己項目代碼複製出來,不講核心邏輯,不太簡潔,於是將自己部署的經驗寫成內容分享出來。 uWSGI 簡介 uWSGI: 一種實現了多種協議(包括 uwsgi、http)並能提供伺服器搭建功能的 Pytho ...
  • 1 文本Embedding 將整個文本轉化為實數向量的技術。 Embedding優點是可將離散的詞語或句子轉化為連續的向量,就可用數學方法來處理詞語或句子,捕捉到文本的語義信息,文本和文本的關係信息。 ◉ 優質的Embedding通常會讓語義相似的文本在空間中彼此接近 ◉ 優質的Embedding相 ...