C# winform表單間傳值(使用委託或事件)

來源:互聯網
上載者:User

標籤:region   summary   詳細   工程   設定   nsvalue   win   目的   server   

表單間傳值

今天得空,剛好看到網上好多人再找winform表單間傳值的問題,由於昨天項目的最佳化的感覺不錯,就寫了個C# winform表單間傳值的demo,希望能給需要的人的帶來協助;

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

C#winform表單間傳值,三種方法樣本,注釋詳細。使用方法:使用vs2013開啟編譯運行即可;

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

方法2與方法3即為發布訂閱模式(觀察者模式)----我也是設計模式的初學者,如有問題歡迎大家email我,謝謝;

示範表單的介面如下:

在MainForm中開啟A、B表單,在MainForm中輸入文本資料,點擊發送訊息,A、B的文字框會顯示對應的資料;

主表單為訊息的發行者,表單A、B等等為訊息的接收者;

部分代碼如下(全部原始碼參考上述連結):

1、主表單的部分代碼:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace WinFrmDemo{        public partial class MainForm : Form    {        #region 方法1(不推薦)--通過儲存對象的引用調用的對象的公有方法實現表單的傳值        //當接收資料的表單增加,需要修改發送訊息的代碼,並且增加相應數量的表單引用  可擴充性差,耦合性較高        //public ObeserverFormA ChildFormA { get; set; }        //public ObeserverFormB ChildFormB { get; set; }         #endregion        #region 方法2---委託方式傳值        //定義發布訊息的委託  委託是一個類型 委託可以在外部獲得執行        public Action<string> SendMsg { get; set; }         #endregion        #region 方法3(推薦)--事件方式        //增加event關鍵字        //定 義訊息發布的事件  事件是委託的一個特殊執行個體  事件只能在類的內部觸發執行        public event EventHandler SendMsgEvent; //使用預設的事件處理委託        #endregion               public MainForm()        {            InitializeComponent();        }        private void ParentFrm_Load(object sender, EventArgs e)        {            #region 方法1(不推薦)            //ObeserverFormA childFormA = new ObeserverFormA();            //ChildFormA = childFormA;            //childFormA.Show();            //ObeserverFormB childFormB = new ObeserverFormB();            //ChildFormB = childFormB;            //childFormB.Show();             #endregion            #region 方法2---委託方式傳值            //子表單彈出來之前,為委託賦值,關注主表單訊息的變化,當有多個表單需要接收資訊,只需要在此修改即可            //ObeserverFormA childFormA = new ObeserverFormA();            //SendMsg += childFormA.SetText;//委託賦值            //childFormA.Show();            //ObeserverFormB childFormB = new ObeserverFormB();            //SendMsg += childFormB.SetText;            //childFormB.Show();             #endregion            #region 方法3(推薦)--事件方式            //子表單彈出來之前,註冊事件,關注主表單訊息的變化,當有多個表單需要接收資訊,只需要在此修改即可            ObeserverFormA childFormA = new ObeserverFormA();            SendMsgEvent += childFormA.MainFormTxtChaned;//為子表單註冊事件,在子表單中事件處理代碼中設定文本            childFormA.Show();            ObeserverFormB childFormB = new ObeserverFormB();            SendMsgEvent += childFormB.MainFormTxtChaned;            childFormB.Show();            #endregion                    }        //當MainForm中輸入文本,點擊發送訊息,子表單的文字框顯示主表單的資料        private void btnSendMsg_Click(object sender, EventArgs e)        {            #region 方法1(不推薦)            //ChildFormA.SetText(this.txtMsg.Text);            //ChildFormB.SetText(this.txtMsg.Text);             #endregion            #region 方法2---委託方式傳值            //if (SendMsg!=null)            //{            //    SendMsg(this.txtMsg.Text);//執行所有註冊的委託            //}            #endregion            #region 方法3(推薦)--事件方式            //觸發事件            //EventArgs,寫一個子類繼承該類,子類中添加需要封裝的資料資訊,此處只需要傳遞string資訊,詳見MyEventArgs            SendMsgEvent(this,new MyEventArg(){Text=this.txtMsg.Text});            #endregion        }    }}

2、子表單A部分代碼

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace WinFrmDemo{    public partial class ObeserverFormA : Form    {        /// <summary>        /// 提供外部存取自己元素的方法        /// </summary>        /// <param name="txt"></param>        public void SetText(string txt)        {            this.txtMsg.Text = txt;        }        public ObeserverFormA()        {            InitializeComponent();        }        public void AfterParentFrmTextChange(object sender, EventArgs e)        {            //拿到父表單的傳來的文本            MyEventArg arg = e as MyEventArg;            this.SetText(arg.Text);        }        internal void MainFormTxtChaned(object sender, EventArgs e)        {            //取到主表單的傳來的文本            MyEventArg arg = e as MyEventArg;            this.SetText(arg.Text);                    }    }}

3、子表單B的部分代碼

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace WinFrmDemo{    public partial class ObeserverFormB : Form    {        public ObeserverFormB()        {            InitializeComponent();        }        /// <summary>        /// 提供外部存取自己元素的方法        /// </summary>        /// <param name="txt"></param>        public void SetText(string txt)        {            this.txtMsg.Text = txt;        }        internal void MainFormTxtChaned(object sender, EventArgs e)        {            //取到主表單的傳來的文本            MyEventArg arg = e as MyEventArg;            this.SetText(arg.Text);        }    }}

 

 

來源:http://www.cnblogs.com/codeToUp/p/5371062.html

 

C# winform表單間傳值(使用委託或事件)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.