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;
跨窗体传值示例
效果
实现
首先在弹窗的窗体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; }
上一篇: 这就是所谓的心有灵犀么
下一篇: cakephp打印sql语句的方法