您的位置:首页 > 其它

DelegateAndEvent应用之回马枪

2009-08-21 11:54 288 查看
应用Delegate和Event实现函数的回调,在实际的开发中非常有用。它实现的实际上是一种依赖通知的效果。通常可以用在:子窗体信息更新的结果反馈至母窗体;类的属性值和UI控件值依赖时的相互“通知”等。

现通过简单的例子Demo这两种应用场景:

一:类的属性值发生变化时,反馈到和它关联的控件中:
1.建立类 BasicInfo,并为其建立委托和事件

namespace DelegateAndEventDemo
{
///说明:通常属于哪个类的事件,定义的时候要作为类的成员定义其委托和事件
///       而回调函数则在调用方进行定义;
///       这样,类的事件触发时,就可以执行调用方的方法,从而实现函数回调。
///
//定义delegate
public delegate void ValueChangeEventHandler(object o, EventArgs e);

class BasicInfo
{
//为此类定义一个事件
public event ValueChangeEventHandler onValueChanged;

private string id;
public string ID
{
get
{
return id;
}
set
{
id = value;
onValueChanged(id, null);//当属性值发生变化时,触发事件
}
}
}
}


2.建立Form1,并拉出几个TextBox控件。当属性值发生改变时,反馈到相关连的控件

namespace DelegateAndEventDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
BasicInfo info = new BasicInfo();
info.onValueChanged += GetChange;//为类的时间定义回调函数

info.ID = txtId.Text; //改变属性值(将触发事件)
}

//回调函数的定义
public void GetChange(object o,EventArgs e)
{
string s = o as string;

txtName.Text = "Name" + s;
}
}
}


二:子窗体信息更新的结果反馈至母窗体

1.建立子窗体frmChild,建立相应的委托和事件。

namespace DelegateAndEventDemo
{
public delegate void ChangeValueEventhandler(object o,EventArgs e);

public partial class frmChild : Form
{
public event ChangeValueEventhandler OnValueChanged;

public frmChild()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
OnValueChanged(txtValue.Text, null);

this.Close();
}
}
}


2.建立母窗体frmMain:
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
frmChild frm = new frmChild();
frm.OnValueChanged += ChangeValue;
frm.Show();
}

private void ChangeValue(object o, EventArgs e)
{
string s = o as string;

txtString.Text = s;
}
}


说明:子窗体更新信息后,触发相应的事件,并关闭;此事件将执行在母窗体中为其指定的回调函数,由于存在参数的传递,从而达到“回马枪”的效果

三:经典的 猫叫,主人醒,老鼠跑
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

/// 编码规范
///
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: