C#窗体间常用的几种传值方式及委托与事件详解
本文将介绍C#窗体之间常用的几种传值方式,包括参数传递、全局变量、委托、事件等,并详解委托与事件的概念和使用方法。
参数传递
参数传递是最简单的窗体之间传值的方式,即在调用方法时将参数传递给被调用方法。
示例:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.Show();
f2.SetTitle(textBox1.Text);
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
public void SetTitle(string title)
{
this.Text = title;
}
}
在 Form1 中点击按钮后,创建并显示 Form2 并将 textBox1 的文本传递给 Form2 的 SetTitle 方法,在 SetTitle 方法中设置了 Form2 的标题。
全局变量
全局变量是指在一个应用程序中可以在所有窗体之间共享的变量,在一个窗体中声明后,其它窗体也可以访问和修改该变量的值。使用全局变量时,需要注意多线程访问和修改的同步问题。
示例:
public partial class Form1 : Form
{
public static string SharedString = “”;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
SharedString = textBox1.Text;
Form2 f2 = new Form2();
f2.Show();
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
textBox1.Text = Form1.SharedString;
}
}
在 Form1 中点击按钮后,将 textBox1 的文本赋给全局变量 SharedString 并创建并显示 Form2,在 Form2 的构造函数中将 Form1 中的全局变量 SharedString 赋给 textBox1。
委托
委托是一种安全的、类型安全(type-safe)的函数指针,使用委托可以实现方法的回调和事件的处理。
示例:
public partial class Form1 : Form
{
public delegate void SetTitleDelegate(string title);
public SetTitleDelegate SetTitleHandler;
public Form1()
{
InitializeComponent();
// 将 SetTitle 方法绑定到 SetTitleHandler 委托上
SetTitleHandler = SetTitle;
}
public void SetTitle(string title)
{
this.Text = title;
}
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.Show();
// 通过调用委托实现传值
SetTitleHandler(textBox1.Text);
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
}
在 Form1 中定义了一个 SetTitleDelegate 委托,并将 SetTitle 方法绑定到 SetTitleHandler 委托上。在点击按钮后,创建并显示 Form2 并调用 SetTitleHandler 委托将 textBox1 的文本传递给 SetTitle 方法,实现了窗体之间的传值。
事件
事件是由特定条件触发的动作,使用事件可以实现多个窗体之间的通信和协调。在一个窗体中,定义事件和事件处理函数,在另一个窗体中通过订阅事件和事件处理函数实现事件的响应。事件的定义和使用需要考虑到多线程的同步问题。
示例:
public partial class Form1 : Form
{
public event EventHandler TitleChanged;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.Show();
// 触发事件
if (TitleChanged != null)
{
TitleChanged(this, EventArgs.Empty);
}
}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
// 订阅事件
((Form1)Application.OpenForms[0]).TitleChanged += OnTitleChanged;
}
private void OnTitleChanged(object sender, EventArgs e)
{
this.Text = ((Form1)sender).Text;
}
}
在 Form1 中定义了一个 TitleChanged 事件,并在点击按钮后触发该事件。在 Form2 的构造函数中订阅了 Form1 中的 TitleChanged 事件,并定义了对应的事件处理函数 OnTitleChanged,在事件触发后设置 Form2 的标题为 Form1 的标题。