• 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

     

  • 相关阅读:
    20220424 Java核心技术 卷2 高级特性 4
    20220424 Java核心技术 卷2 高级特性 12
    20220424 Java核心技术 卷2 高级特性 2
    20220424 Java核心技术 卷2 高级特性 1
    20220424 Java核心技术 卷2 高级特性 5
    20220424 Java核心技术 卷2 高级特性 6
    多个modal遮罩层覆盖不全的问题
    ROCRK3588SPC八核8K人工智能开源主板
    RK3568行业平板人脸识别解决方案
    K8S中pod和container的资源管理:CPU和Memory
  • 原文地址:https://www.cnblogs.com/cgli/p/2075006.html
Copyright © 2020-2023  润新知