博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WinForm中使用自定义事件
阅读量:5153 次
发布时间:2019-06-13

本文共 3045 字,大约阅读时间需要 10 分钟。

using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication8

{

class Program

{
static void Main(string[] args)
{

//第三步:定义对象并添加事件

Priter priter = new Priter();
priter.OnPrintComplete += new EventHandler<PrintCompleteEventArgs>(priter_OnPrintComplete);
for (int i = 0; i < 500; i++)
{

//第四步:执行实际方法

priter.Print(i);
System.Threading.Thread.Sleep(100);
}
}

static void priter_OnPrintComplete(object sender, PrintCompleteEventArgs e)

{

//第五步:处理回调函数

Console.WriteLine("完成打印:" + e.message);
if (e.message % 10 == 0)
Console.WriteLine("我是10的倍数," + e.message);
}
}

/// <summary>

/// 第二步:定义事件类
/// </summary>
public class Priter
{
/// <summary>
/// 用event关键字声明事件对象(如果EventHandler不够用,可先用delegate定义一个处理事件)
/// </summary>
public event EventHandler<PrintCompleteEventArgs> OnPrintComplete;

/// <summary>

/// 实际打印方法
/// </summary>
/// <param name="data"></param>
public void Print(int data)
{
//在这里执行打印操作..
//TO DO..
//..
Console.WriteLine("开始打印:"+data);

//执行完后通知执行外部的事件方法(如果是异步操作,可另外开一线程监听然后执行以下通知)

OnPrintComplete(this, new PrintCompleteEventArgs(data));
}
}

/// <summary>

/// 第一步:定义事件参数类
/// </summary>
public class PrintCompleteEventArgs : EventArgs
{
public int message;
public PrintCompleteEventArgs(int Message)
{
this.message = Message;
}
}
}

--------------------------------------------------------------------------

namespace 事件
{
//发布事件的类
public class TestEventSource
{
//定义事件参数类
public class TestEventArgs : EventArgs
{
public readonly char KeyToRaiseEvent;
public TestEventArgs(char keyToRaiseEvent)
{
KeyToRaiseEvent = keyToRaiseEvent;
}
}

//定义delegate

public delegate void TestEventHandler(object sender, TestEventArgs e);
//用event 关键字声明事件对象
public event TestEventHandler TestEvent;

//事件触发方法

protected virtual void OnTestEvent(TestEventArgs e)
{
if (TestEvent != null)
TestEvent(this, e);
}

//引发事件

public void RaiseEvent(char keyToRaiseEvent)
{
TestEventArgs e = new TestEventArgs(keyToRaiseEvent);
OnTestEvent(e);
}

}

//监听事件的类
public class TestEventListener
{
//定义处理事件的方法,他与声明事件的delegate具有相同的参数和返回值类型
public void KeyPressed(object sender, TestEventSource.TestEventArgs e)
{
Console.WriteLine("发送者:{0},所按得健为:{1}", sender, e.KeyToRaiseEvent);
}

//订阅事件

public void Subscribe(TestEventSource evenSource)
{
evenSource.TestEvent += new TestEventSource.TestEventHandler(KeyPressed);
}
//取消订阅事件
public void UnSubscribe(TestEventSource evenSource)
{
evenSource.TestEvent -= new TestEventSource.TestEventHandler(KeyPressed);
}
}

//测试类

public class Test
{
public static void Main()
{
//创建事件源对象
TestEventSource es = new TestEventSource();
//创建监听对象
TestEventListener el = new TestEventListener();
//订阅事件
Console.WriteLine("订阅事件\n");
el.Subscribe(es);
//引发事件
Console.WriteLine("输入一个字符,再按enter键");
string s = Console.ReadLine();
es.RaiseEvent(s.ToCharArray()[0]);
//取消订阅事件
Console.WriteLine("\n取消订阅事件\n");
el.UnSubscribe(es);

//引发事件

Console.WriteLine("输入一个字符,再按enter健");
s = Console.ReadLine();
es.RaiseEvent(s.ToCharArray()[0]);

 

}

}

}

转载于:https://www.cnblogs.com/zhuawang/archive/2013/05/26/3100323.html

你可能感兴趣的文章
0115 创建类并调用
查看>>
pc/app 项目/功能设计
查看>>
IIS并发连接数和数据库连接池
查看>>
c#操作IIS之IISHelper
查看>>
VIJOS P1540 月亮之眼
查看>>
Job流程:提交MR-Job过程
查看>>
成功也不需要太长的时间
查看>>
【6.29】数组和方法
查看>>
sencha touch之模型(model)
查看>>
PAT L2-016 愿天下有情人都是失散多年的兄妹
查看>>
抛弃IIS,利用FastCGI让Asp.net与Nginx在一起
查看>>
Linux下源码编译安装PostgreSQL数据库
查看>>
Win7生产力心得(1)——如何让资源管理器中目录树与内容窗口产生联动效果
查看>>
C. Tanya and Toys_模拟
查看>>
System.nanoTime与System.currentTimeMillis
查看>>
mysql的锁机制
查看>>
菜根谭#163
查看>>
CVE-2017-5638——S2-045
查看>>
入职互联网行业两个月
查看>>
最大子阵列和
查看>>