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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...