zoukankan      html  css  js  c++  java
  • c# 事件处理

    引用:http://zhidao.baidu.com/question/23715790.html&__bd_tkn__=28b46e61363e812e5f00e362a3fe3cadc048dae28078338d51fed8133ea5c69d362ad36bb4bcda3b39bb3949f6bbe47087ac3af56e60b1f4e7eb60157a5ffa339860a0f840491fc7006f320ad23bbb7a4905ef750d2acb89a0453475725a435cbb150f333ab6adabe906eabbc9db8f02cc3621f74b

    C#中的事件处理程序 
    C#中的事件处理程序是一个带有特定输入参数的代理,如下所示: 
    public delegate void MyEventHandler(object sender, MyEventArgs e); 
    
    上面定义中的第一个参数(sender)指定了发生事件的对象,第二个参数(e)存储着在事件处理程序中要用到的数据。MyEventArgs类是继承EventArgs类得来的,EventArgs类是MouseEventArgs、ListChangedEventArgs等更专业化的类的基础类。对于GUI事件,我们可以使用这些特定的EventArgs类的对象,而无需自己创建特定的EventArgs类。然而,对于非GUI事件而言,我们仍然需要创建自己的特定的EventArgs类,存储希望向代理对象传递的数据。我们可以通过继承EventArgs类创建自己特定的EventArgs类: 
    public class MyEventArgs EventArgs{ 
    public string m_myEventArgumentdata; 
    } 
    在事件处理程序中,代理对象的调用需要用到event关健字,如下所示: 
    public event MyEventHandler MyEvent; 
    下面我们将建立二个类,体会.Net框架中事件处理机制的工作原理。在对代理的讨论的第二个步骤中,要求我们定义与定义的代理有完全相同的输入参数的方法。在我们的例子中,类A将提供事件处理程序(与代理对象具有相同输入参数的方法。),它将创建代理对象(对代理讨论中的第三步)并安装事件处理程序。类A然后会将代理对象传递给类B。当类B中有事件出现时,它就会执行类A中的事件处理程序方法。 
    using System; 
    //步骤1:创建代理对象 
    public delegate void MyHandler1(object sender,MyEventArgs e); 
    public delegate void MyHandler2(object sender,MyEventArgs e); 
    //步骤2:创建事件处理程序方法 
    class A{ 
    public const string m_id="Class A"; 
    public void OnHandler1(object sender,MyEventArgs e){ 
    Console.WriteLine("I am in OnHandler1 and MyEventArgs is {0}", e.m_id); 
    } 
    public void OnHandler2(object sender,MyEventArgs e){ 
    Console.WriteLine("I am in OnHandler2 and MyEventArgs is {0}", e.m_id); 
    } 
    //步骤3:创建代理,安装事件处理程序,并向启动事件的对象注册。 
    public A(B b){ 
    MyHandler1 d1=new MyHandler1(OnHandler1); 
    MyHandler2 d2=new MyHandler2(OnHandler2); 
    b.Event1 +=d1; 
    b.Event2 +=d2; 
    } 
    } 
    //步骤4:通过代理调用封装的方法。 
    class B{ 
    public event MyHandler1 Event1; 
    public event MyHandler2 Event2; 
    public void FireEvent1(MyEventArgs e){ 
    if(Event1 != null){ 
    Event1(this,e); 
    } 
    } 
    public void FireEvent2(MyEventArgs e){ 
    if(Event2 != null){ 
    Event2(this,e); 
    } 
    } 
    } 
    public class MyEventArgs EventArgs{ 
    public string m_id; 
    } 
    public class Driver{ 
    public static void Main(){ 
    B b= new B(); 
    A a= new A(b); 
    MyEventArgs e1=new MyEventArgs(); 
    MyEventArgs e2=new MyEventArgs(); 
    e1.m_id ="Event args for event 1"; 
    e2.m_id ="Event args for event 2"; 
    b.FireEvent1(e1); 
    b.FireEvent2(e2); 
    } 
    } 
    
    C#中的GUI事件处理 
    Windows Forms(支持GUI应用程序的.NET框架)中的事件处理使用.NET事件处理模式。我们下面将应用这种模式编写一个简单的应用程序,该应用程序有一个继承自System.Windows.Forms.Form类的MyForm类。如果仔细地研究一下代码和其中的三行注释,就会发现其实我们无须定义代理和使用event关健字调用这些代理,因为我们已经可以使用GUI控制(表格、按钮等)的事件(鼠标点击等),代理就是System.EventHandler。当然了,我们仍然需要定义方法,创建代理对象(System.EventHandler),并在代理对象中安装方法,一旦有事件发生,方法就会开始执行。 
    using System; 
    using System.Drawing; 
    using System.Collections; 
    using System.ComponentModel; 
    using System.Windows.Forms; 
    using System.Data; 
    
    public class MyForm Form{ 
    private Button m_nameButton; 
    private Button m_clearButton; 
    private Label m_nameLabel; 
    
    private Container m_components = null; 
    
    public MyForm(){ 
    initializeComponents(); 
    } 
    private void initializeComponents(){ 
    m_nameLabel=new Label(); 
    m_nameButton = new Button(); 
    m_clearButton = new Button(); 
    
    SuspendLayout(); 
    
    m_nameLabel.Location=new Point(16,16); 
    m_nameLabel.Text="Click NAME button, please"; 
    m_nameLabel.Size=new Size(300,23); 
    
    m_nameButton.Location=new Point(16,120); 
    m_nameButton.Size=new Size(176, 23); 
    m_nameButton.Text="NAME"; 
    //创建代理,并安装方法,将代理捆绑在按钮的Click事件上 
    m_nameButton.Click += new System.EventHandler(NameButtonClicked); 
    
    m_clearButton.Location=new Point(16,152); 
    m_clearButton.Size=new Size(176,23); 
    m_clearButton.Text="CLEAR"; 
    //创建代理,并安装方法,将代理捆绑在按钮的Click事件上 
    m_clearButton.Click += new System.EventHandler(ClearButtonClicked); 
    
    this.ClientSize = new Size(292, 271); 
    this.Controls.AddRange(new Control[] {m_nameLabel,m_nameButton,m_clearButton}); 
    this.ResumeLayout(false); 
    } 
    //定义输入参数与代理完全相同的方法 
    private void NameButtonClicked(object sender, EventArgs e){ 
    m_nameLabel.Text="My name is john, please click CLEAR button to clear it"; 
    } 
    private void ClearButtonClicked(object sender,EventArgs e){ 
    m_nameLabel.Text="Click NAME button, please"; 
    } 
    public static void Main(){ 
    Application.Run(new MyForm()); 
    } 
    }
  • 相关阅读:
    jquery及相关兼容插件的版本搭配
    jquery IE7 下报错:SCRIPT257: 由于出现错误 80020101 而导致此项操作无法完成
    兼顾php和jquery新版本的checkbox的写法
    jquery.validate动态更改校验规则 【转】
    Google的10大座右铭
    用jQuery屏蔽掉按回车键时提交表单
    sizeof()和strlen()在求字符串长度时的差别
    Matlab使用心得
    C++ 数据类型及相关问题 及输出精度控制
    原生javascript满屏上下滚动
  • 原文地址:https://www.cnblogs.com/sode/p/2674460.html
Copyright © 2011-2022 走看看