您的位置:首页 > 其它

winform 下实现消息传递机制

2011-06-12 19:42 453 查看
在开发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.divmy.com/ 原文地址:/article/6120233.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: