写一个事件(不仅仅是为控件添加事件)------------C#

最近看书上有关于事件的内容,之前在写winform时,事件都是直接用的,对内部的写法并不了解。

这里将自定义一个事件。

首先,写一个类。

 public  class NewMailEventArgs:EventArgs//这个类以后是事件的参数,用于传递事件的一些附加信息。但是必须继承EventArgs
    {
        private readonly string m_from, m_to, m_subject;

        public NewMailEventArgs(string from,string to,string subject)
        {
            m_from = from;
            m_to = to;
            m_subject = subject;
        }

        public string From { get { return m_from; } }
        public string To { get { return m_to; } }
        public string Subject { get { return m_subject; } }

    }

再写一个类,类里面是有关事件的一些东西。

 public  class MailManager
    {
        public event EventHandler<NewMailEventArgs> NewMail;//定义一个事件,其实它是一个范型委托。这个委托需要两个参数。可以按F12跟到这个委托的定义

         //定义一个事件的触发方法,这里为了类型安全,声明称protect
        protected virtual void OnNewMail(NewMailEventArgs e)//上面定义的那个类,在这里用来作为参数,传递信息
        { //因为时间可能被很多地方调用,为了类型安全,这里不是直接操作NewMail事件
            EventHandler<NewMailEventArgs> temp = Volatile.Read(ref NewMail);
            if (temp != null) temp(this,e);
        }
        //公开一个方法,用于把输入转化成一个期望的事件,触发事件OnNewMail
        public void SimulateNewMail(string from ,string to,string subject)
        {
            NewMailEventArgs e = new NewMailEventArgs(from ,to,subject);
            OnNewMail(e);
        }
    }

下面就是定义和触发事件了

 class Program
    {
        static void Main(string[] args)
        {
            MailManager mail = new MailManager();

            mail.NewMail += mail_NewMail;//创建事件

            mail.SimulateNewMail("hahah","hshshs","ksksksk");//触发这个事件

            mail.NewMail -= mail_NewMail;//销毁事件
        }

        static void mail_NewMail(object sender, NewMailEventArgs e)
        {
            Console.WriteLine("Faxing mail message:");
            Console.WriteLine("from={0},to={1},subject={2}", e.From, e.To, e.Subject);
            Console.ReadKey();
        }
    }
时间: 2024-12-14 08:37:05

写一个事件(不仅仅是为控件添加事件)------------C#的相关文章

c#给用户控件添加事件处理程序

1.首先在usercontrol后台添加如下代码: public partial class MyControl: UserControl { //添加事件代理       public event EventHandler AX; //在需要响应的事件中添加 private void MyControl_MouseClick(object sender, MouseEventArgs e)        {            if (AX != null)            {    

mfc 动态为控件添加事件1

知识点: 认识窗口过程 GetWindowLong SetWindowLong 为动态控件绑定事件 一.获取窗口过程 二.设置新窗口过程 1.书写一个新窗口过程函数 窗口过程格式 LRESULT CALLBACK WindowProc( HWND hwnd, // 窗口句柄 UINT uMsg, // 消息事件 WPARAM wParam, // 消息参数1 LPARAM lParam //消息参数2 ); CallWindowProc 把消息事件传递给以前的窗口过程 LRESULT CallW

mfc 动态为控件添加事件2

重载窗口过程 为动态控件绑定事件 一.重载窗口过程处理函数 CWnd::WindowProc virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam ); LRESULT CALLBACK WindowProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message para

自动为DEV GridView控件添加SizeChanged事件

实现gdv设置的抽象对象,不用每个gdv控件都添加sizechanged事件,只需执行gdc绑定sql函数,在其中会自动添加SizeChanged事件. //2016.5.13 by sngk //根据控件大小自动调整GridView列宽模式,尽量使列充满 //2016.11.19 实现自动添加sizechanged事件 //该函数只执行一次,在赋值时 public static void BestFitGridViewColumnsWidth(DevExpress.XtraGrid.GridC

jquery 为后来添加的控件添加方法

利用传统的click()等为后来利用append()等函数添加的控件添加事件时,没有反应,会失效,经查阅资料,发现如果面对动态产生的控件,只有 on() 能成功的绑定到动态控件中,click是无效的,故采用ON()实现: 哎呦,可解决了我一个大问题!!! 原文地址:https://www.cnblogs.com/mxitan/p/9057855.html

C#在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级

首先在form1的窗体载入中新建了一个Class1对象并将本身的引用传递进入其构造函数,然后在Class1的构造函数中创建一个线程.该线程所代理的方法事件是本类中的一个add方法.而add方法的内容则是在form1上放一个textbox.然而这个流程你需要注意的有几个问题:1.哪个是主线程?所谓主线程是第一个启动的线程,是从main开始的.form1的这个窗体是由主线程创建的.2.Thread t的线程是什么?t是由主线程创建的,t的操作内容是在由主线程创建的窗体上放一个textbox.也就是说

Android IOC 之 注解绑定控件 以及事件 事例 代码简单注释讲解

想必开发过android的都使用过一些 框架,然而框架里都会使用一些,注解来帮助我们,节省大量的代码开发量.同时也使代码更加的简洁. 但是注解是通过java反射来实现的当然可能会牺牲掉一些性能. 以下是本人写的一个较为简单的绑定控件,并且触发其OnclickListem 事件. //直接先看下注解方法.比较简单,清晰 public class MainActivity extends FragmentActivity { <span style="white-space:pre"

创建一个带模版的用户控件 V.3

再重构此篇<创建一个带模版的用户控件  V.2>http://www.cnblogs.com/insus/p/4164149.html 让其它动态实现header,Item和Footer. Insus.NET不想所有代码写在InstantiateIn(Control container)方法内的switch分流上.其实是想使用开发设计模式的中介者(Mediator)来拆分它. 拆分为四个方法:ListItemType.Header: ListItemType.Item: ListItemTyp

创建一个带模版的用户控件 V.2

前面有做练习<创建一个带模版的用户控件>http://www.cnblogs.com/insus/p/4161544.html .过于简化.通常使用数据控件Repeater会有网页写好Header,Item,AlternatingItem和Footer.如果需要动态产生列时,我们需要在后台写好模板. 再来复习一下这篇<Repeater控件动态变更列(Header,Item和Foot)信息>http://www.cnblogs.com/insus/archive/2013/03/22