现在的位置: 首页 > 综合 > 正文

委托 ,事件

2013年03月21日 ⁄ 综合 ⁄ 共 2481字 ⁄ 字号 评论关闭

1:首先声明一个委托。

2:定义一个和委托有 相同输入参数和返回参数的处理函数    , 然后定义这个委托类型的事件UpdateEvent。

3:new一个委托对象,并且用刚刚定义的函数作为对象的构造函数。然后把这个对象和这个时间做+=运算

4:使用UpdateEvent(sender, e);出发事件。

5:使用UpdateEvent 和处理函数进行-=运算进行删除。

 

参考代码1:

using System;//这里声明了一个:public delegate void EventHandler(object sender, EventArgs e);//1

namespace SmartDeviceProject3
{
    public partial class Form2 : Form
    {
        UpdateTrigger Trigger = new UpdateTrigger();
        public Form2()
        {
            InitializeComponent();
            Trigger.UpdateEvent += new EventHandler(Trigger_UpdateEvent);//3
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            MessageBox.Show("For2_Load _hgj");
        }
        public void Trigger_UpdateEvent(object sender, EventArgs e)//2.1
        {
            MessageBox.Show("Trigger_UpdateEvent");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            MessageBox.Show("button2_Click");
            Trigger.RaiseUpdateEvent(sender, e);//4
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Trigger.UpdateEvent -= Trigger_UpdateEvent;
        }

    }

    public class UpdateTrigger
    {
        public event EventHandler UpdateEvent;//2,2

        public void RaiseUpdateEvent(object sender, EventArgs e)//4
        {
            if (UpdateEvent != null)
            {
                UpdateEvent(sender, e);
            }
        }
    }

}

 

 

例子2:
DAL类中:

    public delegate void deleException(System.Exception exception);//声明一个委托
    public event deleException evenException;//定义一个委托类型事件
    public void CallEvent(System.Exception exception)//触发事件方法
    {
          deleException messageEvent = evenException;
          if (messageEvent != null)
          {
                  //通知所有已订阅事件的对象(传递消息)
              messageEvent(exception);
          }
    }
    
          /// <summary>
      /// 打开与数据库连接
      /// </summary>
      /// <returns></returns>
      public bool Open()
      {
          try
          {
              if (m_SqlCeConnection != null && m_SqlCeConnection.State == ConnectionState.Closed)
                  m_SqlCeConnection.Open();
              return true;
          }
          catch (System.Exception e)
          {
              CallEvent(e);//触发事件
              return false;
          }
      }
      
Form1类中:
    private void ShowMessage(Exception ex)//事件处理
  {
     MessageBox.Show(ex.Message);
  }
 
    DAL _dal = new DAL(……)……;
    _dal.evenException += new deleException(ShowMessage);//侦听事件
    _dal.Open();//若Open()时产生异常,则调用ShowMessage();
    
    在上面的例子中或许看不出有什么好的,但在某些场合,就显示很重要了。比如通过线程更新UI,因为线程直接更新UI是不安全的。
    "委托"是"函数指针"链表,当然该链表也可以只有一个元素,如果这样的话:"委托" 约等于 "函数指针";
  "事件"是一类特特殊的"委托",你定义一个"事件",表示你同时定义了:一个委托+两个方法

抱歉!评论已关闭.