欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

CS中委托与事件的使用-以Winform中跨窗体传值为例

程序员文章站 2022-04-29 14:22:16
场景 委托(Delegate) 委托是对存有某个方法的引用的一种引用类型变量。 委托特别用于实现事件和回调方法。 声明委托 实例化委托 声明了委托类型,委托对象必须使用new关键字来创建,且与一个特定的方法相关。 当创建委托时,传递到 new 语句的参数就像方法调用一样书写,但是不带有参数。例如: ......

场景

委托(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;

 

跨窗体传值示例

效果

 CS中委托与事件的使用-以Winform中跨窗体传值为例

 

 

实现

首先在弹窗的窗体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;
        }