事件处理的本质

27人阅读 评论(0) 收藏 举报
分类:

当在点击一个按钮执行某个操作时,你有没有想过,为什么点击了这个按钮就会执行某个操作,这是为什么?那么接下来就让我来解开这里面的秘密。
用微软中定义的事件函数来说明这个问题是再简单不过的的事情了。
首先,点击按钮是一个事件,也就是说,当你点击了按钮就相当于是触发了一个事件,学过C#窗体编程的同学都知道,事件是其中常用一个属性,按钮的触发就使用了这个属性。
不闲谈了,解决实际的问题。
将按钮的整个过程分开为两个过程,1.按钮点击事件发生。2.执行事件函数,完成相应的操作。可以想象一下,这两个过程在分开时都可以方便地实现,第一条只需要创建一个按钮点击区域,来检测鼠标或触碰是否在本按钮区域之内即可,第二条也只需要创建一个事件处理函数即可。关键是怎样在这两点之间架起一个传递信息的桥梁,事件发生时怎样调用事件处理函数。
接下来是干货,话不多说直接上代码:
这是一个窗体程序,实现的基本工能是,创建一个按钮Button,创建一个文本输入框TextBox,创建一个显示文本条Label。程序中预先设置好一个体重基础值weight。当在文本中输入一个数值后,点击button按钮,程序内部判断这个值是大于原先设置的值,还是小于原先设置的值,如果大于原先设置的值就在label中显示“小明变胖了,现在的体重是”同时再把这个值给这个给weight。如果小于这个值就显示“小明变瘦了,现在体重是”同时把这个值给weight。借这个程序来说明按钮的执行本质。

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

namespace _13._6
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public delegate void WeightChangedEventHandler(object sender, EventArgs e);
        class Woman
        {
            #region 构造函数
            public Woman(string n,int a,double w)
            {
                _name = n;
                _age = a;
                _weight = w;
            }
            #endregion

            #region 事件
            public event WeightChangedEventHandler GetFatter;
            public event WeightChangedEventHandler GetThinner;
            #endregion
            #region 属性
            private string _name;           
            public string Name1
            {
                get
                {
                    return _name;
                }
                set
                {
                    _name = value;
                }
            }
            private int _age;
            public int Age
            {
                get
                {
                    return _age;
                }
                set
                {
                    if (value < 15 || value > 60)
                    {
                        throw new ArgumentOutOfRangeException("输入的年龄不合理");
                    }
                    _age = value;
                }
            }
            private double _weight;
            public double Weight
            {
                get
                {
                    return _weight;
                }
                set
                {
                    if (value < 30 || value > 200)
                    {
                        throw new ArgumentOutOfRangeException("输入的体重不合适");
                    }
                    double originalWeight = _weight;
                    _weight = value;
                    if (value > originalWeight)
                    {
                        if (GetFatter != null)
                        {
                            GetFatter(this, EventArgs.Empty);
                        }
                    }
                    else
                    {
                        if (value < originalWeight)
                        {
                            if (GetThinner != null)
                            {
                                GetThinner(this, EventArgs.Empty);
                            }
                        }
                    }
                }
            }
            #endregion
        }
        Woman mary;
        private void Form1_Load(object sender, EventArgs e)
        {

            mary = new Woman("小明", 23, 64.5f);
            mary.GetFatter += new WeightChangedEventHandler(GetfatterHandler);
            mary.GetThinner += GetthinnerHandler;
            System.Console.WriteLine("说明此处是 代码加载时执行的");
        }
        private void GetfatterHandler(object sender,EventArgs e)
        {
            Woman woman = (Woman)sender;
            textBox2.AppendText(woman.Name1 + "变胖了,现在体重" + woman.Weight + "kg.\r\n");
        }
        private void GetthinnerHandler(object sender,EventArgs e)
        {
            Woman woman = (Woman)sender;
            textBox2.AppendText(woman.Name1 + "变瘦了,现在体重" + woman.Weight + "kg.\r\n");
        }

        private void button(object sender, EventArgs e)
        {
            double d;
            if(double.TryParse(textBox1.Text,out d))
            {
                try
                {
                    mary.Weight = d;
                }
                catch (ArgumentOutOfRangeException) { }
            }
        }
    }
}

在weight属性中可以发现调用了事件处理函数,在Form1_Load(object sender, EventArgs e)函数中将对应的事件发生时要执行的函数加载到自身的函数上,这一步才是整个按钮执行的关键一步,这一步利用了事件的装订,来触发相应的事件执行函数。这个函数是在函数执行时直接加载执行的函数。

查看评论

java事件处理的三种方式

java事件处理的三种方式方法一:使用接口 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; impor...
  • u013189927
  • u013189927
  • 2016-03-29 00:49:39
  • 1918

复杂事件处理(Complex Event Processing)入门1

复杂事件处理(Complex Event Processing)入门1 字数967 阅读12 评论0 喜欢0 一个新产品需要重点考虑业务风险控制。关于风险控制系统整体的技术方案可以参考...
  • CCJHDOPC
  • CCJHDOPC
  • 2016-04-20 20:05:32
  • 1975

复杂事件处理技术概览(二)

翻译前言:感觉作者有点夸夸其谈兼絮絮叨叨,但文章还是很有用的。原文《An Overview of Complex Event Processing》 复杂事件处理技术概览(一)   用户用例:客户问题...
  • binhualiu1983
  • binhualiu1983
  • 2016-06-12 14:45:18
  • 396

Notes for CEP & Esper Learning(1)——初识复杂事件处理

-- 关于这次学习 --实习狗要开始熟悉业务啦~当前的任务是初步了解Complex Event Processing(CEP)和Esper。作为一个门外汉,入门的计划就是先了解复杂事件处理,再熟悉其中...
  • u011133858
  • u011133858
  • 2015-05-07 21:15:31
  • 673

esper(复杂事件处理引擎)简介

Esper是一个复杂事件处理引擎,用于对同一类型的多个对象进行统计分析。 要统计的多个事件(一个事件通常对应着一个对象)会存储在一个队列中,这里叫它EQueue。 EPL EPL,Event Proc...
  • chuchus
  • chuchus
  • 2015-06-01 14:55:13
  • 1427

CEP学习笔记 --- Complex Event Processing复杂事件处理

CEP学习笔记 --- Complex Event Processing复杂事件处理
  • u012965373
  • u012965373
  • 2017-06-12 11:54:19
  • 1127

Android学习笔记(36):Android的两种事件处理方式

Android提供了两种事件处理的方式:基于回调的事件处理 和 基于监听的事件处理。 我们来说的容易理解一点: (1)基于回调的事件处理就是继承GUI组件,并重写该组件的事件处理方法。除了一些特定...
  • qq_18738333
  • qq_18738333
  • 2016-04-17 00:30:10
  • 3996

[疯狂Java笔记]事件处理:Java事件处理模型

1. Java事件处理三要素:     1) 事件源(Event Source):即事件发生的场所,就是指各个组件,如按钮等,点击按钮其实就是组件上发生的一个事件;     2) 事件(Event):...
  • Lirx_Tech
  • Lirx_Tech
  • 2016-03-05 13:35:39
  • 3254

java 事件处理的几种写法

三种都是在构造方法中添加监听器的,不同的是第一种实例监听器,然后再组件中添加,具体事件处理方法是放在类外的 第二种是不实例,直接用newEnlargeListener(),并且EnlargeList...
  • Gbookman
  • Gbookman
  • 2016-07-13 22:34:46
  • 944

复杂事件处理(Complex Event Processing)

一个新产品需要重点考虑业务风险控制。关于风险控制系统整体的技术方案可以参考 支付系统风控系统建设思考 。此方案尽管能够满足业务需求,但对于海量交易数据分析、风险事件的实时处理、大量的风险规则处理上,在...
  • lijunpeng71
  • lijunpeng71
  • 2017-07-31 13:25:08
  • 281
    个人资料
    持之以恒
    等级:
    访问量: 1149
    积分: 159
    排名: 107万+
    文章存档
    最新评论