事件与委托实例

委托的语法和方法比较相似,只是比方法多了一个关键字delegate ,我们都知道方法就是将类型参数化,所谓的类型参数化就是说该方法接受一个参数,而该参数是某种类型的参数,比如int、string等等;而委托是将方 法参数化,说了上面的那个类型参数化之后,相信你也能猜到方法参数化的意思了,对,就是将方法作为一个参数传到一个委托中。
首先来看看声明委托的语句:
public deletate void MyDelegate();
public:访问修饰符 delegate:关键字 void:返回类型 MyDelegate:委托名称 ( ):参数列表.

事件就是一个特殊的委托,委托和事件就类似于字段和属性的关系,事件是对委托做了一个封装(这是个人理解)
先看看声明一个事件:
public Event MyDelegate EventMyDel;
public:访问修饰符 Event:关键字 MyDelegate:委托 EventMyDel:事件名称

一、定义一个订阅者:

   public class Publishser
    {
        //定义委托GeneralEventHandler
       public delegate string GeneralEventHandler();
       //定义一个事件GeneralEvent
       public event GeneralEventHandler GeneralEvent;
       // 调用事件的普通方法
       public string  Dosomething()
       {
           string rtn = "";
           if (GeneralEvent != null)
           {
               rtn = GeneralEvent();
           }
           return rtn;
       }

    }

二、定义一个监督者:

 public class Subscriber1
    {
       public string OnGeneralEvent()
       {
           return "Subscriber1";
       }
    }

三、定义执行者:

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Publishser pub = new Publishser();
            Subscriber1 sub = new Subscriber1();
            Subscriber2 sub2 = new Subscriber2();

            pub.GeneralEvent += new Publishser.GeneralEventHandler(sub.OnGeneralEvent);
            pub.GeneralEvent += new Publishser.GeneralEventHandler(sub2.OnGeneralEvent);
            pub.GeneralEvent += new Publishser.GeneralEventHandler(GetNumberChanged);
            label1.Text= pub.Dosomething();

        }
        public string GetNumberChanged()
        {
            return "Subscriber3";
        }
    }

备注: 委托名:GeneralEventHandler;事件名去掉Handler:GeneralEvent;调阅方法名:(事件前面加上On):OnGeneralEvent

令附一实例:转自:http://2sharings.com/2014/csharp-winform-pass-value-between-forms-by-delegate-and-event

在C# WINFORM的日常开发中,我们通常需要遇到跨窗体传值这一问题,实现的方式也是有很多的,今天给大家分享一种通过委托和事件来实现的传值方式。不多说废话,我将用一个具体的实例来跟大家说明怎么样利用很委托和事件以及自定义的参数来实现跨窗体传值。

例如:程序中我们有一个主窗体,其中文本框的值是我们需要从另外一个窗体中获取的,在这个表单窗体中,填写完整联系人地址信息后,我们希望把这些信息回传到主窗体中,最终,我们想让主窗体得到如下的数据:

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

namespace DelegatePassValue
{
  public partial class frmAddress : Form
  {
    //声明一个更新Address的委托
    public delegate void AddressUpdateHandler(object sender, AddressUpdateEventArgs e);

    //声明一个更新Address的事件
    public event AddressUpdateHandler AddressUpdated;

    public frmAddress()
    {
      InitializeComponent();
    }

    private void btnOk_Click(object sender, EventArgs e)
    {
      var args = new AddressUpdateEventArgs(txtCountry.Text, txtState.Text, txtCity.Text, txtZipCode.Text);
      AddressUpdated(this,args);
      this.Dispose();
    }

    private void btnCancel_Click(object sender, EventArgs e)
    {
      this.Dispose();
    }
  }

  public class AddressUpdateEventArgs : System.EventArgs
  {
    private string mCountry;
    private string mState;
    private string mCity;
    private string mZipCode;
    public AddressUpdateEventArgs(string sCountry, string sState, string sCity, string sZipCode)
    {
      this.mCountry = sCountry;
      this.mState = sState;
      this.mCity = sCity;
      this.mZipCode = sZipCode;
    }
    public string Country { get { return mCountry; } }
    public string State { get { return mState; } }
    public string City { get { return mCity; } }
    public string ZipCode { get { return mZipCode; } }
  }
}

其次,是主窗体(即要取得传递值的窗体),如下:

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

namespace DelegatePassValue
{
  public partial class frmMain : Form
  {
    public frmMain()
    {
      InitializeComponent();
    }

    private void btnSetAddress_Click(object sender, EventArgs e)
    {
      var frmAddr = new frmAddress();
      frmAddr.AddressUpdated += new frmAddress.AddressUpdateHandler(AddressForm_ButtonClicked);
      frmAddr.Show();
    }

    private void AddressForm_ButtonClicked(object sender, AddressUpdateEventArgs e)
    {
      txtCountry.Text = e.Country;
      txtState.Text = e.State;
      txtCity.Text = e.City;
      txtZipCode.Text = e.ZipCode;
    }

    private void btnClose_Click(object sender, EventArgs e)
    {
      Application.Exit();
    }
  }
}

时间: 2024-11-08 19:03:20

事件与委托实例的相关文章

C#中委托和事件的区别实例解析

这篇文章主要介绍了C#中委托和事件的区别,并分别以实例形式展示了通过委托执行方法与通过事件执行方法,以及相关的执行流程与原理分析,需要的朋友可以参考下 本文实例分析了C#中委托和事件的区别,分享给大家供大家参考之用.具体如下: 大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法.事件可以被看作一个委托类型的变量,通过事件注册.取消多个委托或方法.本篇分别通过委托和事件执行多个方法,从中体会两者的区别. 一.通过委托执行方法 1 2 3 4 5 6 7 8 9 10 11 12 13 1

从事件来看委托

事件是基于委托,为委托提供了一种发布/订阅机制,在dotNet到处都能看到事件,一个简单的例子就是在windows应用程序中,Button类提供了Click事件,这类事件就是委托,触发Click事件时调用的处理程序方法需要定义,其参数也是由委托类型定义的,事件模型可以用下图简要说明. 在这个模型中,事件的响应者通过订阅关系直接关联在事件拥有者的事件上,我们把这种事件模型或者CLR事件模型.因为CLR事件本质上是一个委托实例,我们暂且模仿CLR属性的说法,把CLR事件定义为一个委托类型实例的包装器

事件与委托

C# 中的委托和事件 文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建一个委托类型的实例(委托变量).例如:委托类型 委托实例 = new 委托类型(方法名); 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易

C# 事件与委托的区别

C# 事件与委托的区别 先看一段程序 class Program { static void Main(string[] args) { Test obj = new Test(); obj.print += printout1; //绑定printout1方法 obj.print += printout2; //绑定printout2方法 obj.start(); } static void printout1() { Console.WriteLine("输出第一段字符串"); }

C# 委托实例(跨窗体操作控件)

原文地址 http://blog.csdn.net/bdstjk/article/details/7004035 FORM1(一个名为“打开form2”的button控件) FORM2(一个名为“改变form1颜色“的button控件) 启动时,FORM1中点击button控件“打开form2””使FORM2显示出来. 点击FORM2中的“改变form1颜色”后,Form1中颜色改变. 完整代码 1 using System; 2 using System.Collections.Generic

C#委托实例

C# 委托实例 ,关键词 :delegate 下面是微软给出的官方解释,自行感受一下,   本质就是把方法当作参数使用 delegate 是表示对具有特定参数列表和返回类型的方法的引用的类型. 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联. 你可以通过委托实例调用方法. 委托用于将方法作为参数传递给其他方法. 事件处理程序就是通过委托调用的方法. 你可以创建一个自定义方法,当发生特定事件时,某个类(如 Windows 控件)就可以调用你的方法. 下面的示例演示了一个委托

面向对象基础——事件和委托

事件和委托 在典型的面向对象软件的一般流程中,代码段创建类的对象并在该对象上调用力法.在这种情况下,调用程序是主动代码,因为它们是调用方法的代码.而对象是被动的,因为只有当某种方法被调用时才会用上对象并执行某种动作. 然而,也可能存在相反的情况.对象可以执行一些任务并在执行过程中发生某些事情时通知调用程序.称这类事情为事件(event),对象的事件发布称为引发事件. 事件驱动处理对于.NET来说并不是什么技术,在事件驱动处理中,当有事件发生时,某些代码段会通知其他对事件感兴趣的代码段.当用户使用

事件和委托(Event vs. Delegate)-事件阉割版的Delegate

引言 关于事件和委托的文章看过很多,但总是记不完整.尤其是在给别人讲解的时候总是很零碎,所以在此整理一下,也供大家参考,很请大家不吝赐教. 本文从一个子类如何触发基类的事件(Event),引出事件和委托的共性和区别.再简单分析下背后原因,深层原因也给大家提供了部分参考资料.欢迎大家留言讨论.   问题 "如果我想在子类里触发父类的事件(Event)应该如何实现?"(可以先自己做下或者想下,再继续看您的做法是否也曾有我碰到技术误区)   问题分解为两步: 父类定义了一个事件(Event)

C#事件与委托详解【精华 多看看】

Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用".它所实现的功能与C/C++中的函数指针十分相似.它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m.但与函数指针相比,delegate有许多函数委托和事件在 .Net Framework中的应用非常广泛指针不具备的优点.首先,函数指针只能指