C#使用事件方式Winform窗体之间传值
【摘自:http://www.cnblogs.com/codeToUp/p/5371062.html】
工程的源代碼地址:https://github.com/yes-or-no/WinFormTransValueDemoByDelOrEvent.git
C#winform窗體間傳值,三種方法示例,注釋詳細(xì)。使用方法:使用vs2013打開(kāi)編譯運(yùn)行即可;
工程中總共介紹了三種方法:
###方法1:通過(guò)保存對(duì)象的引用調(diào)用其方法實(shí)現(xiàn)對(duì)子窗體的控制;
###方法2:通過(guò)委托,在子窗體顯示之前,為委托賦值,關(guān)注主窗體的數(shù)據(jù)變化,當(dāng)有當(dāng)有多個(gè)窗體需要接收信息,只需要為委托繼續(xù)賦值(+=)即可,實(shí)現(xiàn)了數(shù)據(jù)傳遞的解耦性;
###方法3:子窗體彈出來(lái)之前,注冊(cè)事件,關(guān)注主窗體消息的變化,當(dāng)有多個(gè)窗體需要接收信息,,只需要分別為窗體注冊(cè)數(shù)據(jù)接收事件即可,實(shí)現(xiàn)了數(shù)據(jù)傳遞的解耦性;
方法2與方法3即為發(fā)布訂閱模式(觀察者模式)
演示窗體的界面如下:
在MainForm中打開(kāi)A、B窗體,在MainForm中輸入文本數(shù)據(jù),點(diǎn)擊發(fā)送消息,A、B的文本框會(huì)顯示對(duì)應(yīng)的數(shù)據(jù);
主窗體為消息的發(fā)布者,窗體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(不推薦)--通過(guò)保存對(duì)象的引用調(diào)用的對(duì)象的公有方法實(shí)現(xiàn)窗體的傳值18 //當(dāng)接收數(shù)據(jù)的窗體增加,需要修改發(fā)送消息的代碼,并且增加相應(yīng)數(shù)量的窗體引用 可擴(kuò)展性差,耦合性較高19 //public ObeserverFormA ChildFormA { get; set; }20 //public ObeserverFormB ChildFormB { get; set; } 21 #endregion22 23 #region 方法2---委托方式傳值24 //定義發(fā)布消息的委托 委托是一個(gè)類型 委托可以在外部獲得執(zhí)行25 public Action<string> SendMsg { get; set; } 26 #endregion27 28 #region 方法3(推薦)--事件方式29 //增加event關(guān)鍵字30 //定 義消息發(fā)布的事件 事件是委托的一個(gè)特殊實(shí)例 事件只能在類的內(nèi)部觸發(fā)執(zhí)行31 public event EventHandler SendMsgEvent; //使用默認(rèn)的事件處理委托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 //子窗體彈出來(lái)之前,為委托賦值,關(guān)注主窗體消息的變化,當(dāng)有多個(gè)窗體需要接收信息,只需要在此修改即可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 //子窗體彈出來(lái)之前,注冊(cè)事件,關(guān)注主窗體消息的變化,當(dāng)有多個(gè)窗體需要接收信息,只需要在此修改即可66 ObeserverFormA childFormA = new ObeserverFormA();67 SendMsgEvent += childFormA.MainFormTxtChaned;//為子窗體注冊(cè)事件,在子窗體中事件處理代碼中設(shè)置文本68 childFormA.Show();69 ObeserverFormB childFormB = new ObeserverFormB();70 SendMsgEvent += childFormB.MainFormTxtChaned;71 childFormB.Show();72 #endregion73 74 75 76 }77 78 //當(dāng)MainForm中輸入文本,點(diǎn)擊發(fā)送消息,子窗體的文本框顯示主窗體的數(shù)據(jù)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);//執(zhí)行所有注冊(cè)的委托92 //}93 94 #endregion95 96 #region 方法3(推薦)--事件方式97 //觸發(fā)事件98 //EventArgs,寫一個(gè)子類繼承該類,子類中添加需要封裝的數(shù)據(jù)信息,此處只需要傳遞string信息,詳見(jiàn)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 /// 提供外部訪問(wèn)自己元素的方法 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 //拿到父窗體的傳來(lái)的文本 31 MyEventArg arg = e as MyEventArg; 32 this.SetText(arg.Text); 33 } 34 35 internal void MainFormTxtChaned(object sender, EventArgs e) 36 { 37 //取到主窗體的傳來(lái)的文本 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 /// 提供外部訪問(wèn)自己元素的方法 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 //取到主窗體的傳來(lái)的文本 33 MyEventArg arg = e as MyEventArg; 34 this.SetText(arg.Text); 35 } 36 } 37 } public class MyEventArg :EventArgs
{
? //傳遞主窗體的數(shù)據(jù)信息
? public string Text { get; set; }
}
轉(zhuǎn)載于:https://www.cnblogs.com/kennyliu/p/7017104.html
總結(jié)
以上是生活随笔為你收集整理的C#使用事件方式Winform窗体之间传值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【图像处理】RGB Bayer Colo
- 下一篇: 在web.config中配置httpHa