C# 在两个窗体之间传输数据,而无需再次创建新实例

C# 在两个窗体之间传输数据,而无需再次创建新实例,c#,winforms,C#,Winforms,我们可以使用以下代码将数据从Form1传输到Form2: Form2 frm2 = new Form2(); frm2.textBox1.Text = listBox1.SelectedItem.ToString(); frm2Show(); 现在我想在不创建新实例的情况下将数据发送回Form1,这是怎么可能的?一种方法是向Form1添加属性,然后在构造函数中将Form1的实例传递给Form2。然后,Form2可以访问Form1的属性来设置数据。然而,这将Form1和Form2紧密结合在一起,

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

Form2 frm2 = new Form2();
frm2.textBox1.Text = listBox1.SelectedItem.ToString();
frm2Show();
现在我想在不创建新实例的情况下将数据发送回Form1,这是怎么可能的?

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

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

表格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;}
}
订阅活动:

Form2 form2 = new Form2();

form2.Form2Event += GetData;
object data = ///  blah
if(Form2Event != null)
    Form2Event(this, new Form2EventArgs {Data = data});
启动事件:

Form2 form2 = new Form2();

form2.Form2Event += GetData;
object data = ///  blah
if(Form2Event != null)
    Form2Event(this, new Form2EventArgs {Data = data});
一种方法是向Form1添加属性,然后在构造函数中将Form1的实例传递给Form2。然后,Form2可以访问Form1的属性来设置数据。然而,这将Form1和Form2紧密结合在一起,这可能是一件坏事

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

表格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;}
}
订阅活动:

Form2 form2 = new Form2();

form2.Form2Event += GetData;
object data = ///  blah
if(Form2Event != null)
    Form2Event(this, new Form2EventArgs {Data = data});
启动事件:

Form2 form2 = new Form2();

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

您可以很容易地使用带有事件的委托解决此问题

    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 
    }

您可以很容易地使用带有事件的委托解决此问题

    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 
    }