在两个表单之间传输数据而不再创建新实例

时间:2013-09-01 04:55:50

标签: c# winforms

我们可以使用以下代码将数据从Form1传输到Form2:

Form2 frm2 = new Form2();
frm2.textBox1.Text = listBox1.SelectedItem.ToString();
frm2Show();

现在我想将数据发送回Form1而不创建新实例,怎么可能?

2 个答案:

答案 0 :(得分:4)

一种方式是将属性添加到Form1,然后将Form1的实例传递给构造函数中的Form2。然后,Form2可以访问Form1的属性来设置数据。然而,这紧密地联系了Form1Form2,这可能是一件坏事。

更好这样做的方法是在event Form2订阅的Form1中声明Form1和自定义事件处理程序。自定义事件处理程序可以具有一个属性,该属性包含要发送回public event EventHandler<Form2EventArgs> Form2Event; public class Form2EventArgs : EventArgs { // for illustration only: // do NOT use `object` and to NOT call it `Data` public object Data {get;set;} } 的数据。

窗体2:

private void GetData(object sender, Form2EventArgs args)
{
    object data = args.Data;
    // do something with the data
}

Form1中的事件监听器:

Form2 form2 = new Form2();

form2.Form2Event += GetData;

订阅活动:

object data = ///  blah
if(Form2Event != null)
    Form2Event(this, new Form2EventArgs {Data = data});

解雇活动:

{{1}}

答案 1 :(得分:0)

很容易就可以使用委托事件来解决这个问题......

    public delegate void DataSender(object dataObject);
    public event DataSender dataSender;

    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        dataSender("Pass your Data object");
    }

现在在Form1中,您应该订阅在form2上创建的委托

   public Form1()
    {
        InitializeComponent();
    }

   private void button1_Click(object sender, EventArgs e)
    {
        Form2 form2 = new Form2();
        Subscribe(form2);
        form2.ShowDialog();
    }

    private void Subscribe(Form2 form2)
    {
        form2.dataSender += new Form2.DataSender(GetDataFromForm2);
    }

    private void GetDataFromForm2(object dataObject)
    {
        // Do somthing with data 
    }