65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 事件:创建类事件并使用该类

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.69/5 (12投票s)

2007年8月14日

CPOL

2分钟阅读

viewsIcon

49563

downloadIcon

798

关于 C# 事件的教育性文章。

引言

学习在 C# 中创建事件和使用该事件。

背景

此处提供的源代码来自 Visual Studio 2005。如果您使用其他环境,则需要将解决方案解析到您的环境中。请在网上查找相关信息!!!

使用代码

代码是程序员最重要的部分。下载它,看看它,然后如果你不是 100% 确定,再回来这里。

首先,您需要查看我的类,包含事件的类和

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace learnEvents
{
    public delegate void WorkerEndHandler(object o, WFEventArg e);

    /// <summary>
    /// EventArg -> necesary to do corect your job
    /// </summary>
    class WFEventArg : EventArgs
    {
        public readonly string TheString;

        public WFEventArg(string s)
        {
            TheString = s;
        }
    }

    /// <summary>
    /// The class with the event
    /// </summary>
    class Worker
    {
        public readonly string Name;
        public event WorkerEndHandler WorkEnd;

        public Worker(string name)
        {
            Name = name;
        }
        public void Work(string s)
        {
            Thread.Sleep(2500);//Sleep, thats our job :)
            
            //Create a new event arg and after that...
            WFEventArg e1 = new WFEventArg(s);
            //...release it
            OnWorkEnd((object)this, e1);
        }

        void OnWorkEnd(object o, WFEventArg e)
        {
            //release the object
            if (WorkEnd != null)
                WorkEnd(o, e);
        }
    }
} 

那里发生了什么……我们创建一个简单的类 Worker,其中包含一个名为 Work 的过程,该过程有一个参数(一个字符串);这个函数不做任何事情,只是休眠 2.5 秒,然后释放一个事件(告诉 <某人> 它完成了工作)。为此,我们需要一个委托 -WorkerEndHandler- 和一个名为WFEventArg的类,该类继承自EventArgs类。事件由名为 OnWorkEnd 的方法释放

之后,我们需要使用该事件……好吧,我创建了一个带有两个按钮和一个标签的简单窗体,并创建了两个对象Worker(wkr1、wkr2)。单击第一个按钮时,第一个workerwkr1)将工作,第二个按钮也一样。当窗体加载时,我们告诉我们的 worker完成工作时该做什么——> 我们使用Event。我们的worker的事件在同一个方法中:wkr_WorkEnd。此函数的参数与释放事件OnWorkEnd的方法的参数相同,您可以根据需要自定义这些参数。最后,此方法在事件发生时执行我们想要的操作:我将标签文本字段设置为 EventArg 类,并告诉用户 worker 已完成其工作。您可以在此事件中执行任何操作,您可以自由选择!

窗体代码在此

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

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

        #region Lesson
        //we create two workers -> see that class
        Worker wkr1 = new Worker("The 1'st worker");
        Worker wkr2 = new Worker("The 2'nd worker");

        private void button1_Click(object sender, EventArgs e)
        {
            //We tell him to work...
            wkr1.Work("AnAbAnAnA");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //We tell him to work...
            wkr2.Work("aNaBaNaNa");
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //We spent two events ....
            wkr1.WorkEnd += new WorkerEndHandler(wkr_WorkEnd); 
        /*is similar with <<wkr1.WorkEnd += wkr_WorkEnd;>> 
        but if you use VS 2005, it's utilities will help you to build the 
        function with who will treat this event. I don't know if there are
        more benefits for writing this short syntax for wiring this event 
        */

        wkr2.WorkEnd += new WorkerEndHandler(wkr_WorkEnd);
            ///...with the same function! 
        }

        void wkr_WorkEnd(object o, WFEventArg e)
        {
            //The results ...
            Worker worker = (Worker)o;

            label1.Text = e.TheString;
            MessageBox.Show(worker.Name + ":\tI've done my job!!!");
            //...is different from an object to another!
        }
        #endregion
    }
} 

关注点

事件在 c# 编程中是必不可少的,在所有领域:桌面应用程序、Web 应用程序、控制台应用程序等!

历史

关于这个主题有很多文章,但我提交这篇文章是认为想要学习使用事件的人,可以通过一个简单的项目作为例子很容易地学会。

祝大家一切顺利!

我的广告

http://iuliumaniu.ro/

http://floridecrin.iuliumaniu.ro/

http://the-search-engine.blogspot.com/

© . All rights reserved.