委托事件定义和使用

  1. 事件的概念

    • 事件是一种允许对象(在 WinForm 中通常是控件)通知其他对象(如包含该控件的表单或其他业务逻辑类)某个动作已经发生的机制。例如,当用户点击一个按钮时,按钮会 “触发” 一个点击事件,告知程序这个动作发生了,然后程序可以执行相应的代码来响应这个动作。
  2. 定义和使用委托
    • 
      //定义委托类型
      public delegate void MyDelegate();
      
      class Program
      {
          static void Main()
          {
              //实例化委托类型  并绑定需要委托的方法
              MyDelegate myDelegate = new MyDelegate(MyMethod);
              //执行委托
              myDelegate();
          }
      
          static void MyMethod()
          {
              Console.WriteLine("Method called through delegate.");
          }
      }

  3. 在 WinForm 中定义委托事件

    • 步骤一:定义事件委托

      • 事件委托是一种特殊的类型,它定义了事件处理方法的签名。在 C# 中,通常使用EventHandler或自定义委托类型。例如,如果要定义一个自定义的事件,其处理方法需要接收一个字符串参数,可以定义如下委托:
      • //定义委托类型MyEventHandler
        public delegate void MyEventHandler(object sender, string message);
    • 步骤二:在类中定义事件

      • 在包含事件的类(通常是控件类或业务逻辑类)中,使用event关键字定义事件。例如:
      • public class MyClass
        {
            //在MyClass类中声明一个MyEventHandler委托类型的委托事件
            public event MyEventHandler MyEvent;
        }
  4. 在 WinForm 中使用事件

    • 步骤一:订阅事件
      • 在需要响应事件的类(如表单类)中,通过创建事件源对象(即触发事件的对象),并使用+=运算符订阅事件。例如,假设myObjectMyClass的一个实例,并且MyForm类中有一个方法HandleMyEvent用于处理MyEvent事件,订阅事件的代码如下:
      • public partial class MyForm : Form
        {
            //声明MyClass类型的对象myObject
            private MyClass myObject;
            public MyForm()
            {
                InitializeComponent();
                //实例化MyClass类型对象myObject
                myObject = new MyClass();
                //myObject中委托事件进行订阅其他方法
                myObject.MyEvent += HandleMyEvent;
            }
            private void HandleMyEvent(object sender, string message)
            {
                MessageBox.Show(message);
            }
        }
    • 步骤二:触发事件
      • 在事件源类(MyClass)中,当满足一定条件(如某个方法执行完毕或某个属性值改变)时,通过调用事件(如果事件不为空)来触发它。例如:
      • public class MyClass
        {
            public event MyEventHandler MyEvent;
            public void DoSomething()
            {
                // 一些操作
                string message = "事件被触发";
                
                //MyEvent(this,message)
                //如果MyEvent为null,那么整个表达式将不会执行Invoke方法,从而避免了因为尝试在空引用上调用方法而导致的异常。
                //this.Invoke() 会阻塞调用线程,直到 UI 线程处理完委托为止。(同步更新)
                MyEvent?.Invoke(this, message);
            }
        }
  5. 在 WinForm 中,对于系统提供的控件(如按钮、文本框等),它们已经有预定义好的事件(如ButtonClick事件)。可以在设计视图中通过属性窗口中的 “事件” 选项卡,双击事件名称来自动生成事件处理方法的框架,然后在其中编写响应事件的代码。例如,对于按钮的Click事件,当用户点击按钮时,就会执行对应的Click事件处理方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值