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
的标题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#窗体间常用的几种传值方式及委托与事件详解 - Python技术站