事件发布的小程序

  CSharp中 事件基于委托 ,事件为委托提供了一种发布、订阅的机制。本人为了熟悉事件的发布、订阅机制 ,就写了一个小程序来演示发布事件 和 订阅事件。

/**********************************************
* 类 名 称: DateTimeEventArgs
*
* 命名空间: Delegates
*
* 作 者: DreamDays
*
* 说 明: 定制自己的Eventargs,包含相关的时间信息
*
* 时 间:2012年04月08日
********************************************
*/
using System;

namespace Delegates
{
public class DateTimeEventArgs:EventArgs
{
private DateTime firstTime;
//第一个时间
public DateTime FirstTime
{
get { return firstTime; }
set { firstTime = value; }
}
private DateTime lastTime;
//第二个时间
public DateTime LastTime
{
get { return lastTime; }
set
{
lastTime = value;
//求时间差
Second = GetTimeSpace(FirstTime, LastTime);
}
}
private int second;
//时间差
public int Second
{
get { return second; }
set { second = value; }
}
//求两个时间相差的秒
private int GetTimeSpace(DateTime fTime, DateTime lTime)
{
//求去掉毫秒的更好的方法^-^
DateTime newFTime = new DateTime(fTime.Year, fTime.Month, fTime.Day, fTime.Hour, fTime.Minute, fTime.Second);
DateTime newLTime = new DateTime(lTime.Year, lTime.Month, lTime.Day, lTime.Hour, lTime.Minute, lTime.Second);
TimeSpan tsLTime = new TimeSpan(newLTime.Ticks);
TimeSpan tsFTime = new TimeSpan(newFTime.Ticks);
TimeSpan tsTimeSpace = tsLTime.Subtract(tsFTime);
return tsTimeSpace.Seconds;
}
}
}
using System;

namespace Delegates
{
public class Computer
{
/// <summary>
/// 定义一个事件,为外部提供一个订阅
/// </summary>
public event EventHandler<DateTimeEventArgs> NewTimeSpace;
DateTimeEventArgs e;
//接收一个DateTime 并将DateTime保存在 e 中
public void NewTime(DateTime dt)
{
if (e == null||e.LastTime.Year >1)
{
e = new DateTimeEventArgs();
e.FirstTime = dt;
return;
}
e.LastTime = dt;
//如果被订阅 ,就触发事件
if (NewTimeSpace != null)
{
NewTimeSpace(this, e);
}
}
}
}
using System;
using System.Windows.Forms;

namespace Delegates
{
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
}
//提供一个自己定义的事件
Computer computer = new Computer();

private void FrmMain_Load(object sender, EventArgs e)
{
//订阅事件 ,如果触发事件就执行方法 NewCarIsHere
computer.NewTimeSpace += this.NewCarIsHere;
}
//事件触发后执行的方法
public void NewCarIsHere(object sender, DateTimeEventArgs e)
{
this.textBox1.AppendText(string.Format("{0} 到 {1} 相差 {2} 秒\r\n", e.FirstTime.ToString("yyyy年MM月dd日HH时mm分ss秒"), e.LastTime.ToString("yyyy年MM月dd日HH时mm分ss秒"), e.Second.ToString()));
}

private void btnAdd_Click(object sender, EventArgs e)
{
//向自定义事件的发布者提供时间参数 ,提供两次时间就会触发一次自定义的事件
computer.NewTime(DateTime.Now);
}
}
}

   下图为运行效果:

posted @ 2012-04-08 21:01  多夢的歲月  阅读(589)  评论(1编辑  收藏  举报