Winform中的委托与事件实例

作者:袖梨 2022-06-25

首先定义一个继承EventArgs类的类,其中包涵自己要传递的数据,类中的属性都是用来传递数据的:

 代码如下 复制代码
 EventArgs
    public class FormulaSetEvent:EventArgs
    {
        public string _name { set; get; }
        public string _formula { set; get; }
        public int _select { set; get; }
        public FormulaSetEvent(string name, string formula,int select)
        {
            this._select = select;
            this._name = name;
            this._formula = formula;
        }
    }

然后定义委托类型,定义委托事件(写在要触发事件的窗体中):

   

 代码如下 复制代码
     //定义委托类型
        public delegate void DialogEventHandler(object sender, FormulaSetEvent e);
        //定义委托事件
        public event DialogEventHandler ReturnDataEvent;

 

然后开始编辑触发事件:

 

 代码如下 复制代码
        //应用
        private void button2_Click(object sender, EventArgs e)
        {
            if (ReturnDataEvent != null)
            {
                ReturnDataEvent(this,new FormulaSetEvent(this.comboBox1.Text,this.richTextBox1.Text,select));
            }
        }

再然后要在主窗体中注册事件:

 代码如下 复制代码
private void button1_Click(object sender, EventArgs e)
        {
            Form2 form = new Form2();
            form.ReturnDataEvent += new Form2.DialogEventHandler(f2_Event);
            form.ShowDialog();
        }

上面的f2_Event为事件响应的函数:

 

 代码如下 复制代码
void f2_Event(object sender,FormulaSetEvent e)
        {
               this.TextBox1.Text=e._name;
        }

在此就可以获取Form2中的值,并且能在Form2不关闭的情况下修改主窗体的内容 属性;

有时在做“应用”这个按钮功能是会用到

特写一小例子,共享之。
所谓观察者,就好比警察抓小偷时放出的眼线,眼线观察小偷,一有行动,立刻反应给警察。
现有FrmMain(警察),FrmChild1,FrmChild2(姑且当作两个小偷吧),一个定义委托和事件的类MiddleModule,它就是观察者。
且看代码:

 代码如下 复制代码

C# code
MiddleModule:

using System;
using System.Collections.Generic;
using System.Text;

namespace Observer
{
    ///


    /// 定义发布消息的委托
    ///

    /// 发布者
    /// 消息
    public delegate void Send(object sender, object msg);
    ///
    /// 观察者的中间模块组建
    ///

    public class MiddleModule
    {
        ///
        ///消息发布的事件
        ///

        public static event Send eventSend;

        public static void SendMessage(object sender, object msg)
        {
            if (eventSend != null)
            {
                eventSend(sender, msg);
            }
        }
    }
}


namespace WinObserver
 {
     public partial class FrmMain : Form
     {
         /// 


         /// 构造方法,在构造主窗体的时候就订阅来自FrmChild1的消息
         /// 

         public FrmMain()
         {
             InitializeComponent();
             MiddleModule.eventSend += new Send(MiddleModule_eventSend);
         }
 
         /// 
         /// 接收FrmChild1的回传数据
         /// 

         /// 
         /// 
         void MiddleModule_eventSend(object sender, object msg)
         {
             FrmChild1 frmChild1 = sender as FrmChild1;
             if (null != frmChild1)
             {
                 this.lblMsg.Text = "FrmChild1的回传数据:"+msg.ToString();
             }
         }
 
         private void btnShow1_Click(object sender, EventArgs e)
         {
             FrmChild1 frmChild1 = FrmChild1.CreateInstance();
             frmChild1.Show();
         }
 
         private void btnShow2_Click(object sender, EventArgs e)
         {
             FrmChild2 frmChild2 = FrmChild2.CreateInstance();
             frmChild2.Show();
         }
 
         private void btnSend_Click(object sender, EventArgs e)
         {
             //由Observer模块传递数据
             if (String.IsNullOrEmpty(this.txtMsg.Text))
             {
                 MiddleModule.SendMessage(this, String.Empty);
             }
             else
             {
                 MiddleModule.SendMessage(this, this.txtMsg.Text);
             }
         }
     }
 }
  

小偷1:
C# code

 代码如下 复制代码
 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Data;
 using System.Drawing;
 using System.Linq;
 using System.Text;
 using System.Windows.Forms;
 using Observer;
 
 namespace WinObserver
 {
     public partial class FrmChild1 : Form
     {
         private static FrmChild1 frmChild1 = null;
 
         private FrmChild1()
         {
             InitializeComponent();
             MiddleModule.eventSend += new Send(MiddleModule_eventSend);
         }
             
         void MiddleModule_eventSend(object sender, object msg)
         {
             FrmMain frmMain = sender as FrmMain;
             if (null != frmMain)
             {
                 this.lblMsg.Text = msg.ToString();
             }
         }
 
         public static FrmChild1 CreateInstance()
         {
             if (null == frmChild1)
             {
                 frmChild1 = new FrmChild1();
             }
             return frmChild1;
         }
 
         private void btnSendBack_Click(object sender, EventArgs e)
         {
             //由Observer模块传递数据
             if (String.IsNullOrEmpty(this.txtMsg.Text))
             {
                 MiddleModule.SendMessage(this, String.Empty);
             }
             else
             {
                 MiddleModule.SendMessage(this, this.txtMsg.Text);
             }
         }
     }
 }

 

小偷2:

 代码如下 复制代码

C# code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Observer;

namespace WinObserver
{
    public partial class FrmChild2 : Form
    {
        private static FrmChild2 frmChild2 = null;

        ///


        /// 接收来自FrmMain传递过来的数据
        ///

        private FrmChild2()
        {
            InitializeComponent();
            MiddleModule.eventSend += new Send(MiddleModule_eventSend);
        }

        void MiddleModule_eventSend(object sender, object msg)
        {
            FrmMain frmMain = sender as FrmMain;
            if (null != frmMain)
            {
                this.lblMsg.Text = msg.ToString();
            }
        }

        public static FrmChild2 CreateInstance()
        {
            if (null == frmChild2)
            {
                frmChild2 = new FrmChild2();
            }
            return frmChild2;
        }
    }
}

相关文章

精彩推荐