winform 下实现消息传递机制

在开发winform程序的时候,经常会遇到如下情况:

1、把参数从一个窗口传给另外一个窗口

2、更新窗体信息内容时,同时更新另一个的窗口中

对于第一个情况,我们经常采用的方法如下:

(1)、构造函参数传递

public class MyClassA:Form

{

     private string arg="test";

    //一个button按钮事件

    private void btnOK_Click(object sender,EventArgs e)

    {

             MyClassB frm=new MyClassB(arg);

             frm.show();
    }

}

public class MyClassB:Form

{

     private string val;

 

    //带参构造函数

    public MyClassB(string arg)

      {

           val=arg; 
      }
}

 

(2)、成员变量采用get/set 属性设计器,同时放大变量访问权限,如public、internal:

   

//声明一个窗口类A

public class MyClassA:Form

{

    private string myval;

    public string MyVal

    {

       get{return myval;}

       set{myval=value;}

     }

}

//另一个窗口类B

public class MyClassB:Form

{

  public MyClassB()

  {
  }

 private void submit_Click(object sender,EventArgs e)

 {

     MyClassA frma=new MyClassA();

     //frma.MyVal="赋值";

     string test=frma.MyVal;//取值

 }


}

 

(3)、使用静态(static)公有变量:

 

//声明一个窗口类A

public class MyClassA:Form

{

    public static string MyVal ;

}

//另一个窗口类B

public class MyClassB:Form

{

 private string val=MyClassA.MyVal;//通过静态字段访问
}

 

(4)、使用成员函数传参,不过需要修改可以访问的权限

 

以上这些方法都是经常遇到情况,实现起来都很简单,各自有一些性能和代码安全的问题,

建议使用构造函数或者get/set方式进行访问

 

对于第二个情况,一个窗体信息发生变化,另一个窗体也需要跟着更新。

最常见情境:一个数据列表窗体,一个新增数据窗体。提交新增数据之后,同时显示于列表窗体。

数据列表窗体与数据库连接绑定,但是加载数据之后,就会断掉与数据库的连接,也就是数据库连接并不是长时间实时连接。新增数据之后,就得重新加载数据,这种情况关闭之后,重新打开窗口就可以马上解决。但是总得不能要求用户新增数据之后,老是关闭再打开吧!

于是,得设计一个类似消息传递的机制。

 

View Code
   ///<summary>   
    
///   当信息更改是通知其他的窗口重新加载数据   
    
///   使用方法为:
    
///  1)通知信息更改(在更改的窗口调用)   
    
///   MessageNotify.Instance().SendMessage(NotifyInfo.InfoAdd,"提示消息");   
    
///   其中第一个参数为信息号,第二个参数为信息描述   
    
/// 
    
///   2)收取信息(在另一个窗口中)
    
///   使用方法,在每个在构造函数中加入如下语句   
    
///    MessageNotify.Instance().OnMsgNotifyEvent += OnNotifyEvent; 
    
///  
    
/// 同时编写如下的方法用于重新加载数据   
    
///protected  void  OnNotifyEvent(object sender,MessageNotify.NotifyEventArgs e)   
    
///{   
    
/// if   (e.Code == MessageNotity.NotifyInfo.InfoAdd)   
    
/// {
    
///     //控件数据重新绑定
    
/// }
    
///}   
    
///</summary>   
    public class MessageNotify
    {
        
/// <summary>
        
/// 消息自身实例
        
/// </summary>
        private static MessageNotify _mNotify = null;

        
/// <summary>
        
/// 消息委托事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        public delegate void MsgNotifyEvent(object sender, NotifyEventArgs e);

        
/// <summary>
        
/// 消息事件对象
        
/// </summary>
        public event MsgNotifyEvent OnMsgNotifyEvent;

        
/// <summary>
        
/// 构造函数
        
/// </summary>
        protected MessageNotify()
        {
            
//   
            
//   TODO:   在此处添加构造函数逻辑   
            
//   
        }

        
/// <summary>
        
/// 获得自身实例,单例实现
        
/// </summary>
        
/// <returns></returns>
        public static MessageNotify Instance()
        {
            
if (_mNotify == null)
            {
                _mNotify 
= new MessageNotify();
            }
            
return _mNotify;
        }

        
/// <summary>
        
/// 发送消息
        
/// </summary>
        
/// <param name="code"></param>
        
/// <param name="message"></param>
        public void SendMessage(NotifyInfo code, string message)
        {
            NotifyEventArgs e 
= new NotifyEventArgs(code, message);
            
if (OnMsgNotifyEvent != null)
            {
                OnMsgNotifyEvent(
this, e);
            }
        }

        
/// <summary>
        
/// 更新消息事件
        
/// </summary>
        public class NotifyEventArgs : System.EventArgs
        {
            
/// <summary>
            
/// 构造函数
            
/// </summary>
            public NotifyEventArgs()
            {

            }
            
/// <summary>
            
/// 构造函数
            
/// </summary>
            
/// <param name="code">举例更新</param>
            
/// <param name="message">消息内容</param>
            public NotifyEventArgs(NotifyInfo code, string message)
            {
                _mNCode 
= code;
                _mStrMessage 
= message;
            }

            
private NotifyInfo _mNCode;
            
private string _mStrMessage = string.Empty;

            
/// <summary>
            
/// 消息更新区域类型
            
/// </summary>
            public NotifyInfo Code
            {
                
get { return _mNCode; }
                
set { _mNCode = value; }
            }

            
/// <summary>
            
/// 消息
            
/// </summary>
            public string Message
            {
                
get { return _mStrMessage; }
                
set
                {
                    _mStrMessage 
= value;
                    
if (_mStrMessage == null)
                    {
                        _mStrMessage 
= string.Empty;
                    }
                }
            }
        }

        
/// <summary>
        
/// 各种更新信号枚举
        
/// </summary>
        public enum NotifyInfo
        {
            
/// <summary>
            
/// 删除时发生的消息
            
/// </summary>
            InfoAdd,

            
/// <summary>
            
/// 修改时发生的消息
            
/// </summary>
            InfoEidt,

            
/// <summary>
            
/// 删除发生的消息
            
/// </summary>
            InfoDelete,

        }
    }

 转载请保留原文地址: http://www.cnblogs.com/cgli/archive/2011/06/08/2075006.html

 

posted on 2011-06-08 11:33  陈国利  阅读(3419)  评论(1编辑  收藏  举报