• 如何订阅Form的自定义事件


       Window Form类有很多的属性/方法和事件,其中事件属于一种发布订阅模式 。订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主体对象。这个主体对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态。 当一个对象的改变需要同时改变其他对象,而且无需关心具体有多少对象需要改变时,就特别适合用此种模式。本文将演示如何在窗体上自定义一个事件(custom event) : 

    1 自定义一个CustomEventArgs类

      一般自定义的事件都有一个参数,继承自EventArgs.此处我们自定一个CustomEventArgs,类中通过自定义字段来存储参数的值:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace CustomEventsDemo
     7 {
     8     public class CustomEventArgs:EventArgs
     9     {
    10         //自定义字段用于存储值
    11         public object Tag;
    12         public string Message;
    13         public CustomEventArgs()
    14         {
    15             
    16         }
    17         public CustomEventArgs(string message, object tag)
    18         {
    19             Message = message;
    20             Tag = tag;
    21         }
    22     }
    23 }

     2 自定义一个事件

       接下来我们创建一个FormPublisher窗体,然后用 event EventHandler<CustomEventArgs> customEvent;event EventHandler<CustomEventArgs> customSecondEvent和来自定义两个custom Event事件,它们的事件参数为CustomEventArgs.在窗体加载事件中我们触发两个事件(这个顺序会影响在窗体加载时订阅者的事件响应顺序.如果我们创建一个窗体继承此FormPublisher的话,我们会在此窗体的事件面板中看到下图:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.ComponentModel;
     4 using System.Data;
     5 using System.Drawing;
     6 using System.Linq;
     7 using System.Text;
     8 using System.Windows.Forms;
     9 
    10 namespace CustomEventsDemo
    11 {
    12     public partial class FormPublisher : Form
    13     {
    14         //定义两个事件
    15         public event EventHandler<CustomEventArgs> customEvent;
    16         public event EventHandler<CustomEventArgs> customSecondEvent;
    17         public FormPublisher()
    18         {
    19             InitializeComponent();
    20         }
    21 
    22         private void FormWithCutomEvent_Load(object sender, EventArgs e)
    23         {
    24             //确定自定义事件的执行顺序,继承此窗体的子类窗体加载时的默认顺序
    25             if (customEvent != null)
    26             {
    27                 CustomEventArgs customEventArgs = new CustomEventArgs(this.textBox1.Text, "customEvent");
    28                 customEvent(this, customEventArgs);
    29             }
    30             if (customSecondEvent != null)
    31             {
    32 
    33                 CustomEventArgs customEventArgs = new CustomEventArgs(this.textBox1.Text, "customSecondEvent");
    34                 customSecondEvent(this, customEventArgs);
    35             }
    36 
    37         }
    38 
    39         private void button1_Click(object sender, EventArgs e)
    40         {
    41             
    42             this.textBox2.AppendText(this.textBox1.Text + "
    ");
    43             //this.textBox1.Text = "";
    44             if (customSecondEvent != null)
    45             {
    46                 CustomEventArgs customEventArgs = new CustomEventArgs(this.textBox1.Text, "customSecondEvent");
    47                 //触发事件
    48                 customSecondEvent(this, customEventArgs);
    49             }
    50             if (customEvent != null)
    51             {
    52                 CustomEventArgs customEventArgs = new CustomEventArgs(this.textBox1.Text, "customEvent");
    53                 //触发事件
    54                 customEvent(this, customEventArgs);
    55             }
    56         }
    57     }
    58 }

    3 订阅事件

      下面定义一个FormSubscriber窗体来订阅自定义事件,我们要定义另一个窗体的事件,必须要先实例化那个窗体,否则会调用失败:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.ComponentModel;
     4 using System.Data;
     5 using System.Drawing;
     6 using System.Linq;
     7 using System.Text;
     8 using System.Windows.Forms;
     9 
    10 namespace CustomEventsDemo
    11 {
    12     public partial class FormSubscriber : Form
    13     {
    14         FormPublisher form = null;
    15        public FormSubscriber()
    16         {
    17             InitializeComponent();
    18             //启动2个窗体
    19             form = new FormPublisher();
    20             form.Visible = true;
    21            //订阅事件
    22             form.customSecondEvent += form_customSecondEvent;
    23            //订阅事件
    24             form.customEvent += form_customEvent;
    25            //把发布窗体实例化后传入第二个订阅窗体中,否则不能订阅
    26             FormSubScriber2 from2 = new FormSubScriber2(form);
    27             from2.Visible = true;
    28         }
    29 
    30        void form_customSecondEvent(object sender, CustomEventArgs e)
    31        {
    32            this.textBox1.AppendText("Message from Publisher " + e.Message + " from " + e.Tag + "
    ");
    33        }
    34 
    35        void form_customEvent(object sender, CustomEventArgs e)
    36        {
    37            this.textBox1.AppendText("Message from Publisher " + e.Message + " from " + e.Tag + "
    ");
    38        }
    39 
    40         private void FormSubscriber_Load(object sender, EventArgs e)
    41         {
    42             
    43         }
    44     }
    45 }

       另一个窗体也进行订阅:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.ComponentModel;
     4 using System.Data;
     5 using System.Drawing;
     6 using System.Linq;
     7 using System.Text;
     8 using System.Windows.Forms;
     9 
    10 namespace CustomEventsDemo
    11 {
    12     public partial class FormSubScriber2 : Form
    13     {
    14      
    15         public FormSubScriber2()
    16         {
    17             InitializeComponent();
    18         }
    19         public FormSubScriber2(FormPublisher form)
    20         {
    21             InitializeComponent();
    22             //订阅form自定义事件
    23             form.customEvent += form_customEvent;
    24         }
    25         void form_customEvent(object sender, CustomEventArgs e)
    26         {
    27             this.textBox1.AppendText("Message from Publisher " + e.Message + " from " + e.Tag + "
    ");
    28         }
    29 
    30         private void FormSubScriber2_Load(object sender, EventArgs e)
    31         {
    32 
    33         }
    34     }
    35 }

     

  • 相关阅读:
    mockito测试final类/static方法/自己new的对象
    flink 1.11.2 学习笔记(5)-处理消息延时/乱序的三种机制
    linux查找操作
    分析MongoDB架构案例
    legend3---bootstrap modal框出现蒙层,无法点击modal框内容(z-index问题)
    legend3---laravel报419错误
    laravel自定义中间件实例
    laravel中间件Middleware原理解析及实例
    git: Failed to connect to github.com port 443: Timed out
    记忆规律
  • 原文地址:https://www.cnblogs.com/isaboy/p/custom_event_form_publisher_subscriber.html
Copyright © 2020-2023  润新知