日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#使用事件方式Winform窗体之间传值

發布時間:2024/6/21 C# 70 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#使用事件方式Winform窗体之间传值 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【摘自:http://www.cnblogs.com/codeToUp/p/5371062.html】

工程的源代碼地址:https://github.com/yes-or-no/WinFormTransValueDemoByDelOrEvent.git

C#winform窗體間傳值,三種方法示例,注釋詳細。使用方法:使用vs2013打開編譯運行即可;

工程中總共介紹了三種方法:
###方法1:通過保存對象的引用調用其方法實現對子窗體的控制;
###方法2:通過委托,在子窗體顯示之前,為委托賦值,關注主窗體的數據變化,當有當有多個窗體需要接收信息,只需要為委托繼續賦值(+=)即可,實現了數據傳遞的解耦性;
###方法3:子窗體彈出來之前,注冊事件,關注主窗體消息的變化,當有多個窗體需要接收信息,,只需要分別為窗體注冊數據接收事件即可,實現了數據傳遞的解耦性;

方法2與方法3即為發布訂閱模式(觀察者模式)

演示窗體的界面如下:

在MainForm中打開A、B窗體,在MainForm中輸入文本數據,點擊發送消息,A、B的文本框會顯示對應的數據;


主窗體為消息的發布者,窗體A、B等等為消息的接收者;

部分代碼如下(全部源代碼參考上述鏈接):

1、主窗體的部分代碼:

?

1 using System;2 using System.Collections.Generic;3 using System.ComponentModel;4 using System.Data;5 using System.Drawing;6 using System.Linq;7 using System.Text;8 using System.Threading.Tasks;9 using System.Windows.Forms;10 11 namespace WinFrmDemo12 {13 14 15 public partial class MainForm : Form16 {17 #region 方法1(不推薦)--通過保存對象的引用調用的對象的公有方法實現窗體的傳值18 //當接收數據的窗體增加,需要修改發送消息的代碼,并且增加相應數量的窗體引用 可擴展性差,耦合性較高19 //public ObeserverFormA ChildFormA { get; set; }20 //public ObeserverFormB ChildFormB { get; set; } 21 #endregion22 23 #region 方法2---委托方式傳值24 //定義發布消息的委托 委托是一個類型 委托可以在外部獲得執行25 public Action<string> SendMsg { get; set; } 26 #endregion27 28 #region 方法3(推薦)--事件方式29 //增加event關鍵字30 //定 義消息發布的事件 事件是委托的一個特殊實例 事件只能在類的內部觸發執行31 public event EventHandler SendMsgEvent; //使用默認的事件處理委托32 #endregion33 34 35 36 public MainForm()37 {38 InitializeComponent();39 }40 41 private void ParentFrm_Load(object sender, EventArgs e)42 {43 44 #region 方法1(不推薦)45 //ObeserverFormA childFormA = new ObeserverFormA();46 //ChildFormA = childFormA;47 //childFormA.Show();48 //ObeserverFormB childFormB = new ObeserverFormB();49 //ChildFormB = childFormB;50 //childFormB.Show(); 51 #endregion52 53 #region 方法2---委托方式傳值54 //子窗體彈出來之前,為委托賦值,關注主窗體消息的變化,當有多個窗體需要接收信息,只需要在此修改即可55 //ObeserverFormA childFormA = new ObeserverFormA();56 //SendMsg += childFormA.SetText;//委托賦值57 //childFormA.Show();58 //ObeserverFormB childFormB = new ObeserverFormB();59 //SendMsg += childFormB.SetText;60 //childFormB.Show(); 61 #endregion62 63 64 #region 方法3(推薦)--事件方式65 //子窗體彈出來之前,注冊事件,關注主窗體消息的變化,當有多個窗體需要接收信息,只需要在此修改即可66 ObeserverFormA childFormA = new ObeserverFormA();67 SendMsgEvent += childFormA.MainFormTxtChaned;//為子窗體注冊事件,在子窗體中事件處理代碼中設置文本68 childFormA.Show();69 ObeserverFormB childFormB = new ObeserverFormB();70 SendMsgEvent += childFormB.MainFormTxtChaned;71 childFormB.Show();72 #endregion73 74 75 76 }77 78 //當MainForm中輸入文本,點擊發送消息,子窗體的文本框顯示主窗體的數據79 private void btnSendMsg_Click(object sender, EventArgs e)80 {81 #region 方法1(不推薦)82 83 //ChildFormA.SetText(this.txtMsg.Text);84 //ChildFormB.SetText(this.txtMsg.Text); 85 86 #endregion87 88 #region 方法2---委托方式傳值89 //if (SendMsg!=null)90 //{91 // SendMsg(this.txtMsg.Text);//執行所有注冊的委托92 //}93 94 #endregion95 96 #region 方法3(推薦)--事件方式97 //觸發事件98 //EventArgs,寫一個子類繼承該類,子類中添加需要封裝的數據信息,此處只需要傳遞string信息,詳見MyEventArgs99 SendMsgEvent(this,new MyEventArg(){Text=this.txtMsg.Text}); 100 #endregion 101 } 102 } 103 }

?

2、子窗體A部分代碼

1 using System;2 using System.Collections.Generic;3 using System.ComponentModel;4 using System.Data;5 using System.Drawing;6 using System.Linq;7 using System.Text;8 using System.Threading.Tasks;9 using System.Windows.Forms; 10 11 namespace WinFrmDemo 12 { 13 public partial class ObeserverFormA : Form 14 { 15 /// <summary> 16 /// 提供外部訪問自己元素的方法 17 /// </summary> 18 /// <param name="txt"></param> 19 public void SetText(string txt) 20 { 21 this.txtMsg.Text = txt; 22 } 23 public ObeserverFormA() 24 { 25 InitializeComponent(); 26 } 27 28 public void AfterParentFrmTextChange(object sender, EventArgs e) 29 { 30 //拿到父窗體的傳來的文本 31 MyEventArg arg = e as MyEventArg; 32 this.SetText(arg.Text); 33 } 34 35 internal void MainFormTxtChaned(object sender, EventArgs e) 36 { 37 //取到主窗體的傳來的文本 38 MyEventArg arg = e as MyEventArg; 39 this.SetText(arg.Text); 40 41 } 42 } 43 }

3、子窗體B的部分代碼

1 using System;2 using System.Collections.Generic;3 using System.ComponentModel;4 using System.Data;5 using System.Drawing;6 using System.Linq;7 using System.Text;8 using System.Threading.Tasks;9 using System.Windows.Forms; 10 11 namespace WinFrmDemo 12 { 13 public partial class ObeserverFormB : Form 14 { 15 16 public ObeserverFormB() 17 { 18 InitializeComponent(); 19 } 20 21 /// <summary> 22 /// 提供外部訪問自己元素的方法 23 /// </summary> 24 /// <param name="txt"></param> 25 public void SetText(string txt) 26 { 27 this.txtMsg.Text = txt; 28 } 29 30 internal void MainFormTxtChaned(object sender, EventArgs e) 31 { 32 //取到主窗體的傳來的文本 33 MyEventArg arg = e as MyEventArg; 34 this.SetText(arg.Text); 35 } 36 } 37 }

public class MyEventArg :EventArgs
{
? //傳遞主窗體的數據信息
? public string Text { get; set; }
}

轉載于:https://www.cnblogs.com/kennyliu/p/7017104.html

總結

以上是生活随笔為你收集整理的C#使用事件方式Winform窗体之间传值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。