• 文本框内容自动投影,浅谈C#中事件的写法与应用


    C#中委托和事件,对应设计模式:Observe观察者模式

    触发事件A的时候自动引起事件B的改变

    有两个打开的窗体Form1,Form2

    都有一个文本框控件TextBox

    Form1的文本框输入内容时,Form2的文本框内容自动跟随Form1的文本框内容而改变

    【自动投影】

    事件定义一般在触发方【肇事者】定义,

    在触发事件的类中绑定事件处理方法,事件绑定的处理方法一般是在引起后果的一方【被害者】定义。

    比如交通事故肇事者A驾驶车辆闯红灯导致行人B【被害者】重伤。对于程序的事件来说。

    首先A和B要进行事件绑定:产生联系【受害者B在肇事者A的行车轨迹中】

    肇事者A 闯红灯这个事件触发,导致 被害者B重伤。

    事件的主要作用是 传递参数,事件本质上是一种特殊的委托,因此都有

    Invoke()或EventName(实参列表...),

    BeginInvoke(),

    EndInvoke()三种方法。

    与委托不同的是 事件必须在该事件所在的类中Invoke(),BeginInvoke()使用,不能跨类使用。

    事件有add和remove两种属性,语法如下

    【和兰姆达表达式=>一样,-=和+=运算符中间不能有空格和其他任意字符 】

    remove 移除事件

    SomeEvent -= MethodProcess;

    add 绑定事件

    SomeEvent += MethodProcess;

    1.新建窗体应用程序EventAndTrigDemo,在默认的Form1中添加TextBox和Button控件

     2.新建windows窗体Form2,Form2添加一个文本框textBox2, 如图

     

    3.窗体Form2添加一个刷新文本框的方法RefreshTextBox.

    Form2的RefreshTextBox方法如下:

    1. ///
    2. /// 刷新文本框事件 ,必须为public,不然无法访问
    3. ///
    4. ///
    5. public void RefreshTextBox(string message)
    6. {
    7. textBox2.Text = message;
    8. }

    4.切换到Form1,添加文本框更新事件ShadowEvent

    1. ///
    2. /// 文本框的改变事件 Form1的文本框的文本改变 自动引起Form2的文本框的文本改变
    3. /// Form2的文本是Form1的文本的影子
    4. ///
    5. event Action<string> ShadowEvent;

    5.按钮打开Form2的方法,同时绑定form2的RefreshTextBox的方法

    1. Form2 form2 = null;
    2. private void button1_Click(object sender, EventArgs e)
    3. {
    4. if (form2 == null || form2.IsDisposed)
    5. {
    6. form2 = new Form2();
    7. ShadowEvent -= form2.RefreshTextBox;
    8. ShadowEvent += form2.RefreshTextBox;
    9. form2.Show();
    10. }
    11. else
    12. {
    13. form2.Activate();
    14. }
    15. }

    6.窗体Form1为textBox1绑定TextChanged文本框改变事件

    当文本框的值变化时导致Form2的文本框也自动跟着变化,即调用事件

    1. private void textBox1_TextChanged(object sender, EventArgs e)
    2. {
    3. ShadowEvent?.Invoke(textBox1.Text);
    4. }

    7.源程序:

    Form1.cs

    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.Threading.Tasks;
    9. using System.Windows.Forms;
    10. namespace EventAndTrigDemo
    11. {
    12. public partial class Form1 : Form
    13. {
    14. ///
    15. /// 文本框的改变事件 Form1的文本框的文本改变 自动引起Form2的文本框的文本改变
    16. /// Form2的文本是Form1的文本的影子
    17. ///
    18. event Action<string> ShadowEvent;
    19. public Form1()
    20. {
    21. InitializeComponent();
    22. }
    23. Form2 form2 = null;
    24. private void button1_Click(object sender, EventArgs e)
    25. {
    26. if (form2 == null || form2.IsDisposed)
    27. {
    28. form2 = new Form2();
    29. ShadowEvent -= form2.RefreshTextBox;
    30. ShadowEvent += form2.RefreshTextBox;
    31. form2.Show();
    32. }
    33. else
    34. {
    35. form2.Activate();
    36. }
    37. }
    38. private void textBox1_TextChanged(object sender, EventArgs e)
    39. {
    40. ShadowEvent?.Invoke(textBox1.Text);
    41. }
    42. }
    43. }

    源程序Form2.cs

    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.Threading.Tasks;
    9. using System.Windows.Forms;
    10. namespace EventAndTrigDemo
    11. {
    12. public partial class Form2 : Form
    13. {
    14. public Form2()
    15. {
    16. InitializeComponent();
    17. }
    18. ///
    19. /// 刷新文本框事件 ,必须为public,不然无法访问
    20. ///
    21. ///
    22. public void RefreshTextBox(string message)
    23. {
    24. textBox2.Text = message;
    25. }
    26. }
    27. }

    8.程序运行如图

     

  • 相关阅读:
    在eclipse中配置weblogic12c1.1.0
    【AI实战】CUDA 编程入门及开源项目代码分享
    Web APIs:事件高级--事件对象
    mapreduce序列化(Hadoop)
    【Java第十七期】:##模拟实现一个ArrayList
    YOLOv7改进策略:一种新颖的可扩张残差(DWR)注意力模块,增强多尺度感受野特征,助力小目标检测
    Ansible之playbook剧本
    价格监测,如何锁定目标链接
    SpringMVC调用流程
    嵌入式实操----基于RT1170 AWTK1.6版本库编译(三十)
  • 原文地址:https://blog.csdn.net/ylq1045/article/details/127034812