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方法如下:
/// <summary>
/// 刷新文本框事件 ,必须为public,不然无法访问
/// </summary>
/// <param name="message"></param>
public void RefreshTextBox(string message)
{
textBox2.Text = message;
}
4.切换到Form1,添加文本框更新事件ShadowEvent
/// <summary>
/// 文本框的改变事件 Form1的文本框的文本改变 自动引起Form2的文本框的文本改变
/// Form2的文本是Form1的文本的影子
/// </summary>
event Action<string> ShadowEvent;
5.按钮打开Form2的方法,同时绑定form2的RefreshTextBox的方法
Form2 form2 = null;
private void button1_Click(object sender, EventArgs e)
{
if (form2 == null || form2.IsDisposed)
{
form2 = new Form2();
ShadowEvent -= form2.RefreshTextBox;
ShadowEvent += form2.RefreshTextBox;
form2.Show();
}
else
{
form2.Activate();
}
}
6.窗体Form1为textBox1绑定TextChanged文本框改变事件
当文本框的值变化时导致Form2的文本框也自动跟着变化,即调用事件
private void textBox1_TextChanged(object sender, EventArgs e)
{
ShadowEvent?.Invoke(textBox1.Text);
}
7.源程序:
Form1.cs
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 EventAndTrigDemo
{
public partial class Form1 : Form
{
/// <summary>
/// 文本框的改变事件 Form1的文本框的文本改变 自动引起Form2的文本框的文本改变
/// Form2的文本是Form1的文本的影子
/// </summary>
event Action<string> ShadowEvent;
public Form1()
{
InitializeComponent();
}
Form2 form2 = null;
private void button1_Click(object sender, EventArgs e)
{
if (form2 == null || form2.IsDisposed)
{
form2 = new Form2();
ShadowEvent -= form2.RefreshTextBox;
ShadowEvent += form2.RefreshTextBox;
form2.Show();
}
else
{
form2.Activate();
}
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
ShadowEvent?.Invoke(textBox1.Text);
}
}
}
源程序Form2.cs
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 EventAndTrigDemo
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
/// <summary>
/// 刷新文本框事件 ,必须为public,不然无法访问
/// </summary>
/// <param name="message"></param>
public void RefreshTextBox(string message)
{
textBox2.Text = message;
}
}
}
8.程序运行如图
今天的文章文本框内容自动投影,浅谈C#中事件的写法与应用分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/33140.html