zoukankan      html  css  js  c++  java
  • CS中委托与事件的使用-以Winform中跨窗体传值为例

    场景

    委托(Delegate)

    委托是对存有某个方法的引用的一种引用类型变量。

    委托特别用于实现事件和回调方法。

    声明委托

    public delegate int MyDelegate (string s);

    实例化委托

    声明了委托类型,委托对象必须使用new关键字来创建,且与一个特定的方法相关。

    当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有参数。例如:

    public delegate void printString(string s);
    ...
    printString ps1 = new printString(WriteToScreen);

    示例代码

    using System;
    
    delegate int NumberChanger(int n);
    namespace DelegateAppl
    {
       class TestDelegate
       {
          static int num = 10;
          public static int AddNum(int p)
          {
             num += p;
             return num;
          }
    
          public static int MultNum(int q)
          {
             num *= q;
             return num;
          }
          public static int getNum()
          {
             return num;
          }
    
          static void Main(string[] args)
          {
             // 创建委托实例
             NumberChanger nc1 = new NumberChanger(AddNum);
             NumberChanger nc2 = new NumberChanger(MultNum);
             // 使用委托对象调用方法
             nc1(25);
             Console.WriteLine("Value of Num: {0}", getNum());
             nc2(5);
             Console.WriteLine("Value of Num: {0}", getNum());
             Console.ReadKey();
          }
       }
    }

    事件

    事件在类中声明且生成,且通过使用同一个类或其他类中的委托与事件处理程序关联。包含事件的类用于发布事件。这被称为 发布器(publisher) 类。其他接受该事件的类被称为 订阅器(subscriber) 类。事件使用 发布-订阅(publisher-subscriber) 模型。

    发布器(publisher) 是一个包含事件和委托定义的对象。事件和委托之间的联系也定义在这个对象中。发布器(publisher)类的对象调用这个事件,并通知其他的对象。

    订阅器(subscriber) 是一个接受事件并提供事件处理程序的对象。在发布器(publisher)类中的委托调用订阅器(subscriber)类中的方法(事件处理程序)。

    声明事件

    在类的内部声明事件吗,首先必须先声明该事件的委托类型。

    public delegate void BoilerLogHandler(string status);

    然后声明事件本身。

    public event BoilerLogHandler BoilerEventLog;

    跨窗体传值示例

    效果

     

    实现

    首先在弹窗的窗体CurveCompare中声明委托

     public delegate void ChangeTextDelegete(string s);

    然后基于此委托定义事件

     public static event ChangeTextDelegete changeBoxTextEvent;

    然后是按钮的具体的点击事件中的处理

     private void button1_Click(object sender, EventArgs e)
            {
                string aa = "hello";
                if(changeBoxTextEvent != null){
                    changeBoxTextEvent(aa);
                }
            }

    完整弹窗窗体代码

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace ZedGraphTest
    {
        public partial class CurveCompare : Form
        {
            //委托的定义
            public delegate void ChangeTextDelegete(string s);
            //事件声明
            public static event ChangeTextDelegete changeBoxTextEvent;
            public CurveCompare()
            {
                InitializeComponent();
               
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                string aa = "hello";
                if(changeBoxTextEvent != null){
                    changeBoxTextEvent(aa);
                }
            }
    
           
        }
    }

    然后再到要改变值的窗体中。

    在其初始化方法中

     CurveCompare.changeBoxTextEvent += new CurveCompare.ChangeTextDelegete(changeText);

    然后编写改变值的方法

     public void changeText(string s)
            {
                this.textBox1.Text = s;
            }

    Form1完整示例代码

     public partial class Form1 : Form
        {
        
            public Form1()
            {
                InitializeComponent();
              
                CurveCompare.changeBoxTextEvent += new CurveCompare.ChangeTextDelegete(changeText);
            }
    
            public void changeText(string s)
            {
                this.textBox1.Text = s;
            }
    
     
  • 相关阅读:
    easyui源码翻译1.32--Droppable(放置)
    easyui源码翻译1.32--Draggable(拖动)
    easyui源码翻译1.32--Dialog(对话框窗口)
    easyui源码翻译1.32--DateTimeBox(日期时间输入框)
    easyui源码翻译1.32--DateBox(日期输入框)
    easyui源码翻译1.32--ComboTree(树形下拉框)
    easyui源码翻译1.32--ComboGrid(数据表格下拉框)
    我不曾忘记的初心-大厂小厂
    我不曾忘记的初心-屌丝逆袭
    我不曾忘记的初心-愿天堂没有代码
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/11433219.html
Copyright © 2011-2022 走看看