zoukankan      html  css  js  c++  java
  • 我眼中的事件委托

    我眼中的事件委托

    上一篇博文写了委托,总想知道委托的使用场景。网上查出事件委托、回调函数等。

    今天我也写写对事件委托的认知,常思考并总结,对自己总是有好处的,能让知识更加系统完善。人无完人,虽然我也很怕引来大家的一堆谩骂声,但是我也想招来一群志同道合的友人。就像三国的曹操,有人谩骂,有人赞扬,有人示之为敌人,有人示之为我主。

    好拉,不写点费话,总觉得缺少什么。下面谈谈事件委托,这是一对词组,拆分为事件(关键字event)、委托(关键字delegate)

    网上看一位博友总结委托与事件的作用,而且对于事件委托的阐述也很棒。

    委托的作用

        占位,在不知道将来要执行的方法的具体代码时,可以先用一个委托变量来代替方法调用(委托的返回值,参数列表要确定)。在实际调用之前,需要为委托赋值,否则为null。

    事件的作用

        事件的作用与委托变量一样,只是功能上比委托变量有更多的限制。(比如:1.只能通过+=或-=来绑定方法(事件处理程序)2.只能在类内部调用(触发)事件。)

    委托的声明使用,上一篇博文也讲了一部分内容,可以参照了解。

    现在我们来看看ASP.NET中按钮的事件方法:

    protected void btnClose_OnClick(object sender, EventArgs e)

    =》方法:btnClose_OnClick(方法名如果按规定来命名的话,其实可以看出是一个按钮的Click点击事件)

    =》参数:(1)sender:即触发事件的主体,事件的主体可以多样化,故被定义成object类型,通过它能区分不同事件的主体。多事件的回调函数就是通过它来区分

         (2)e:即事件参数,当事件发生时,可以通过该参数来传递一些数据。如果你需要自定义它,可通过继承 EventArgs类来实现


    完整的ASP.NET的例子如下,这个例子主要是说明了btnOpen注册了btnClose的事件,即点击btnOpen按钮会实现btnOpen+btnClose事件。

    aspx页面代码:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="DelegeEventTest.WebForm1" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Button ID="btnOpen" Text="自动化开关灯" runat="Server" OnClick="btnOpen_OnClick" />
            <asp:Button ID="btnReset" Text="重置" runat="server" OnClick="btnReset_Onclick" />
            <asp:Button ID="btnClose" Text="关灯"  runat="Server" OnClick="btnClose_OnClick" />
            <br /><br /><br />
            <asp:Label ID="lblShow" runat="server" />
        </div>
        </form>
    </body>
    </html>

     cs代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;

    namespace DelegeEventTest
    {
        public delegate void EventHandler1(object sender, EventArgs e);
        public partial class WebForm1 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                this.btnOpen.Click += new EventHandler(btnClose_OnClick);
            }

            protected void btnOpen_OnClick(object sender, EventArgs e)
            {
                this.lblShow.Text = "灯已经开启!";
                this.lblShow.Text += "<br/>";
                this.lblShow.Text += "过了一分钟后";
                this.lblShow.Text += "<br/>";
               
            }

            protected void btnClose_OnClick(object sender, EventArgs e)
            {
                this.lblShow.Text = "灯已经关闭!";
            }
            protected void btnReset_Onclick(object sender, EventArgs e)
            {
                this.lblShow.Text = string.Empty; 
            }
        }
    }


    上面ASP.Net的例子大家好像连个delegate的关键字都没有看到,其实是因为微软已经封装好了,其位于命名空间System下面。

    namespace System
    {
        // 摘要:
        //     表示将处理不包含事件数据的事件的方法。
        //
        // 参数:
        //   sender:
        //     事件源。
        //
        //   e:
        //     不包含任何事件数据的 System.EventArgs。
        [Serializable]
        [ComVisible(true)]
        public delegate void EventHandler(object sender, EventArgs e);
    }

    然后我们看一下this.btnOpen.Click += new EventHandler(btnClose_OnClick);(鼠标点击this.btnOpen.Click里的click,然后按键盘F12)

            // 摘要:
            //  在单击 System.Web.UI.WebControls.Button 控件时发生。
            [WebCategory("Action")]
            [WebSysDescription("Button_OnClick")]
            public event EventHandler Click; 

    说明按钮的点击事件需要注册一个事件委托,而btnClose_OnClick函数就是委托指向调用的方法。

     
     
    标签: 委托
  • 相关阅读:
    基于jQuery的自定义插件:实现整屏分页转换的功能
    蝶恋花
    js中面向对象编程
    移动端web页面列表类上拉加载,查看详情,iframe嵌套第三方页面遇到的问题以及解决办法
    控制使用jquery load()方法载入新页面中的元素
    bootstrap-daterangepicker双日历控件开始日期选择问题
    点击select下拉框获取option的属性值
    bootstrap table表格前台分页,点击tab选项,重新刷新表格
    jquery中使元素显示和隐藏方法之间的区别
    jquery对象和DOM对象的相互转换
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3295744.html
Copyright © 2011-2022 走看看