winForm在两个Form中传递数据

在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;
}

总结

  • 构造函数传参:简单直接,适合一次性传递。
  • 公共属性或字段:灵活,适合多次数据交换。
  • 静态类或单例模式:适合全局共享数据。
  • 事件:适合异步通知。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值