当前位置:首页 > C#学习 > 正文内容

C# 事件详解(一)

小道5年前 (2018-11-05)C#学习4050

事件的定义:单词 Event ,译为 “事件”。

通俗的理解:能够发生的什么事情。

事件的功能 = 通知 + 可选的事件参数(即详细消息)


事件的五个组成部分:

  1. 事件的拥有者(event source ,对象)

  2. 事件的成员(event,成员)

  3. 事件的响应者(event subscriber,对象)

  4. 事件处理器(event handler,成员)——本质上是一个回调方法

  5. 事件订阅——把事件处理器与事件关联在一起,本质上是一种以委托类型为基础的“约定”


例子一:一个事件触发两个事件处理器。

using System;
using System.Timers;

namespace 事件1
{
    class Program
    {
        static void Main(string[] args)
        {
            //time:事件拥有者。
            //Elapsed:事件。
            //b和g:事件的响应者。
            //b.Action 和 g.Action:事件处理器。
            //+=:事件订阅。

            Timer time = new Timer();// Timer 在应用程序中生成定期事件。   
            time.Interval = 1000;//获取或设置引发 System.Timers.Timer.Elapsed 事件的间隔。
            男孩 b = new 男孩();//实例化一个 男孩 类 对象b
            女孩 g = new 女孩();//实例化一个 女孩 类 对象g
            time.Elapsed += b.Action;//Elapsed达到间隔时发生。  添加 b.Action 方法
            time.Elapsed += g.Action;//Elapsed达到间隔时发生。  添加 g.Action 方法
            time.Start();//开始(触发事件)
            Console.ReadKey();//按任意键
        }
    }
    class 男孩//定义一个 类
    {
        internal void Action(object sender, ElapsedEventArgs e)//方法
        {
            Console.WriteLine("男孩们喜欢打篮球.");//输出
        }
    }
    class 女孩//定义一个 类
    {
        internal void Action(object sender, ElapsedEventArgs e)//方法
        {
            Console.WriteLine("女孩们喜欢看电视剧.");//输出
        }
    }
}

输出结果:每秒输出事件的订阅,一直循环。

image.png


例子二:单击窗体,触发事件,将该窗体的标题改为当前时间。

image.png

事件的拥有者和事件的响应者不是同一个对象。


首先添加类库的引用:

image.pngimage.png

using System;
using System.Windows.Forms;//引用

namespace 事件2
{
    class Program
    {
        static void Main(string[] args)
        {
            Form form = new Form();// form 事件的拥有者。
            控制器 K = new 控制器(form);//K 事件的响应者。
            form.ShowDialog();//显示窗体。

        }
    }
    class 控制器
    {
        Form F = new Form();//声明一个 窗体
        public 控制器(Form F1)//构造函数。
        {
            if (F1 != null)//判断传进来的窗体是否为空。
            {
                this.F = F1;//这里是 this.F 获得了 F1 窗体的引用。 所以下面的下面的 this.F 订阅的事件,也就是上面 form 订阅的事件。
                this.F.Click += this.FormClick; // Click 事件。   += 事件的订阅
            }
        }
        private void FormClick(object sender, EventArgs e)//FormClick 事件的处理器。
        {
            F.Text = DateTime.Now.ToString();//将窗体的标题 改为 当前时间。
        }
    }
}

输出结果:

image.png



例子三:单击窗体,触发事件,将该窗体的标题改为当前时间。

image.png

事件的拥有者和事件的响应者是同一个对象。

首先添加类库的引用(如例子二图)。

using System;
using System.Windows.Forms;

namespace 事件3
{
    class Program
    {
        static void Main(string[] args)
        {
            MyForm mf = new MyForm();//mf 事件的拥有者  mf 事件的响应者。
            mf.Click += mf.FormClick;//Click 事件   += 事件的订阅。
            mf.ShowDialog();//显示窗口
        }
    }
    class MyForm : Form //定义一个类MyForm 继承自Form类。
    {
        internal void FormClick(object sender, EventArgs e)//FormClick 事件的处理器
        {
            this.Text = DateTime.Now.ToString();//将窗体的标题改为当前时间
        }
    }
}

输出结果:

image.png


例子四:在窗体内,单击 按钮,文本框中显示内容。

image.png

首先添加类库的引用(如例子二图)。

using System;
using System.Windows.Forms;

namespace 事件4
{
    class Program
    {
        static void Main(string[] args)
        {
            MyForm mf = new MyForm();// 实例化一个MyForm 类
            mf.ShowDialog();//显示窗体。
        }
    }
    class MyForm : Form //定义一个类,继承自Form类。
    {
        private Button Btn;//定义按钮字段
        private TextBox Txt;//定义文本框字段
        public MyForm()//构造函数
        {
            this.Btn = new Button();//实例化一个按钮
            this.Txt = new TextBox();//实例化一个文本框
            this.Controls.Add(Btn);//将按钮添加到窗体上
            this.Controls.Add(Txt);//讲文本框添加到窗体上
            this.Btn.Text = "请单击";//按钮 显示的 文本
            this.Btn.Top = 25;//按钮与窗体上部的距离(像素)
            this.Btn.Click += BtnClicked;//按钮的 单击 事件
        }

        private void BtnClicked(object sender, EventArgs e) //事件处理器
        {
            Txt.Text = "小道博客";//文本框显示内容。
        }
    }
}

输出结果:

image.png


例子五:

新建一个窗体,窗体上有一个文本框(名字:文本框)和 5个按钮(名字分别为:按钮1,按钮2,按钮3,按钮4,按钮5)

按钮1 使用 VS 事件定义事件。按钮2 使用 委托方法 定义事件,按钮3 使用简化委托 定义事件,按钮4 使用 匿名委托 定义事件。按钮5 使用Lambda表达式 定义事件。其中1,2,3个按钮都指向同一个事件处理器。

image.png

using System;
using System.Windows.Forms;

namespace 事件5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            按钮2.Click += new EventHandler(this.BtnClicked);//按钮2的单击事件,使用委托方法。
            按钮3.Click += this.BtnClicked;//按钮3的单击事件,简化委托。
            按钮4.Click += delegate (object sender, EventArgs e) { 文本框.Text = "匿名委托"; };//很少见的匿名委托,没有名称 其他地方无法调用
            按钮5.Click += (sender, e) => { 文本框.Text = "Lambda表达式"; };//Lambda表达式 (object sender, EventArgs e) 可以省略写: (sender, e) 
        }

        private void BtnClicked(object sender, EventArgs e)//BtnClicked 是事件处理器,sender传过来的对象(那个按钮触发的事件。)
        {
            if (sender == 按钮1)//判断 
            {
                文本框.Text = "VS默认事件";//文本框输出
            }
            else if (sender == 按钮2)//判断
            {
                文本框.Text = "委托";//文本框输出
            }
            else if (sender == 按钮3)//判断
            {
                文本框.Text = "简化委托";//文本框输出
            }
        }
    }
}

输出结果:

image.pngimage.pngimage.pngimage.pngimage.png


扫描二维码推送至手机访问。

版权声明:本文由小道发布,如需转载请注明出处。

本文链接:https://www.daobk.com/post/113.html

分享给朋友:

“C# 事件详解(一)” 的相关文章

if语句应用:提示用户输入密码,如果输入的是"888888",输出"密码正确",反之则输出"密码不正确"

if语句应用:提示用户输入密码,如果输入的是"888888",输出"密码正确",反之则输出"密码不正确"

if语句应用:提示用户输入密码,如果输入的是"888888",输出"密码正确",反之则输出"密码不正确"。提示用户输入密码,如果密码是“888888”则提示正确,否则提示错误。     &n...

while语句:不断要求用户输入一个数字,然后打印这个数字的二倍,当用户输入q的时候程序退出(return)。

while语句:不断要求用户输入一个数字,然后打印这个数字的二倍,当用户输入q的时候程序退出(return)。

while语句:不断要求用户输入一个数字,然后打印这个数字的二倍,当用户输入q的时候程序退出(return)。            Console.WriteLine("...

​while语句:不断要求用户输入一个数字(假定用户输入的都是正整数)

​while语句:不断要求用户输入一个数字(假定用户输入的都是正整数)

while语句:不断要求用户输入一个数字(假定用户输入的都是正整数),当用户输入end的时候显示刚才输入的数字中的最大值。设一个变量int max,初始值为0,用户每输入一次就把用户输入的和max比较一下,如果输入的比max大,则让max等于用户输入。    ...

类型转换Cast和Convert

类型转换Cast和Convert

把源类型赋值给目标类型,两个类型不一致的时候会发生类型转换。a=b,b是源,a是目标。隐式转换、显式转换。当目标类型一定能满足源类型转换过去后的要求的话就是隐式转换;如果当目标类型不一定能满足源类型转换过去后的要求的话就需要显式转换(程序员自己负责)。比如:把中国人转换为人是隐式转换,把人转换为中国...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。