WinForm中使用自定義事件


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]);

 

}
}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM