2

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

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

现在我想在不创建新实例的情况下将数据发送回 Form1,这怎么可能?

4

2 回答 2

4

一种方法是将属性添加到,然后在构造函数中 传递toForm1的实例。然后可以访问的属性来设置数据。然而,这紧密结合和,这可能是一件坏事。Form1Form2Form2Form1Form1Form2

一个更好的方法是在订阅中声明一个event和一个自定义事件处理程序。自定义事件处理程序可以有一个包含您要发送回的数据的属性。 Form2Form1Form1

表格2:

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

Form1 中的事件监听器:

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

订阅活动:

Form2 form2 = new Form2();

form2.Form2Event += GetData;

触发事件:

object data = ///  blah
if(Form2Event != null)
    Form2Event(this, new Form2EventArgs {Data = data});
于 2013-09-01T05:01:36.673 回答
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 
    }
于 2013-09-01T06:05:38.190 回答