日期:2014-05-18  浏览次数:20900 次

WinForm窗体之间参数传递(委托加事件观察者模式实现)
偶有闲时,看到了有人问起WinForm直接窗体参数的传递。回想起之前的牛X老师所教的方法,特写一小例子,共享之。
所谓观察者,就好比警察抓小偷时放出的眼线,眼线观察小偷,一有行动,立刻反应给警察。
现有FrmMain(警察),FrmChild1,FrmChild2(姑且当作两个小偷吧),一个定义委托和事件的类MiddleModule,它就是观察者。
且看代码:
C# code

MiddleModule:

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

namespace Observer
{
    /// <summary>
    /// 定义发布消息的委托
    /// </summary>
    /// <param name="sender">发布者</param>
    /// <param name="msg">消息</param>
    public delegate void Send(object sender, object msg);
    /// <summary>
    /// 观察者的中间模块组建
    /// </summary>
    public class MiddleModule
    {
        /// <summary>
        ///消息发布的事件
        /// </summary>
        public static event Send eventSend;

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


警察:
C# code
 

namespace WinObserver
{
    public partial class FrmMain : Form
    {
        /// <summary>
        /// 构造方法,在构造主窗体的时候就订阅来自FrmChild1的消息
        /// </summary>
        public FrmMain()
        {
            InitializeComponent();
            MiddleModule.eventSend += new Send(MiddleModule_eventSend);
        }

        /// <summary>
        /// 接收FrmChild1的回传数据
        /// </summary>
        /// <param name="sender"> </param>
        /// <param name="msg"> </param>
        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
    &nb