在WinForms中,两个窗体之间传递数据有多种方法,以下是几种常见且有效的方式:
1. 构造函数传参
通过构造函数传递数据,简单直观。
// Form1
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void OpenForm2Button_Click(object sender, EventArgs e)
{
string data = "Hello, Form2!";
Form2 form2 = new Form2(data);
form2.Show();
}
}
// Form2
public partial class Form2 : Form
{
private string _data;
public Form2(string data)
{
InitializeComponent();
_data = data;
}
}
2. 公共属性或字段
通过设置公共属性或字段传递数据。
// Form1
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void OpenForm2Button_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.Data = "Hello, Form2!";
form2.Show();
}
}
// Form2
public partial class Form2 : Form
{
public string Data { get; set; }
public Form2()
{
InitializeComponent();
}
}
3. 静态类或单例模式
通过静态类或单例模式共享数据。
// DataContainer.cs
public static class DataContainer
{
public static string SharedData { get; set; }
}
// Form1
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void OpenForm2Button_Click(object sender, EventArgs e)
{
DataContainer.SharedData = "Hello, Form2!";
Form2 form2 = new Form2();
form2.Show();
}
}
// Form2
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
string data = DataContainer.SharedData;
MessageBox.Show(data);
}
}
4. 事件
通过事件机制传递数据,适用于需要异步通知的场景。
// Form1
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void OpenForm2Button_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.DataPassed += Form2_DataPassed;
form2.Show();
}
private void Form2_DataPassed(object sender, string data)
{
MessageBox.Show("Data received: " + data);
}
}
// Form2
public partial class Form2 : Form
{
public event EventHandler<string> DataPassed;
public Form2()
{
InitializeComponent();
}
private void SendDataButton_Click(object sender, EventArgs e)
{
DataPassed?.Invoke(this, "Hello, Form1!");
}
}
5. 通过Application.OpenForms
访问窗体(动态获取窗体实例)
实现方式:通过窗体名称从打开窗体集合中获取实例。
// Form2中修改其他窗体控件
var form1 = Application.OpenForms["Form1"] as Form1;
if (form1 != null) {
form1.textBox1.Text = this.textBox1.Text;
}
总结
- 构造函数传参:简单直接,适合一次性传递。
- 公共属性或字段:灵活,适合多次数据交换。
- 静态类或单例模式:适合全局共享数据。
- 事件:适合异步通知。