我们可以使用以下代码将数据从Form1传输到Form2:
Form2 frm2 = new Form2();
frm2.textBox1.Text = listBox1.SelectedItem.ToString();
frm2Show();
现在我想将数据发送回Form1而不创建新实例,怎么可能?
答案 0 :(得分:4)
一种方式是将属性添加到Form1
,然后将Form1
的实例传递给构造函数中的Form2
。然后,Form2
可以访问Form1
的属性来设置数据。然而,这紧密地联系了Form1
和Form2
,这可能是一件坏事。
更好这样做的方法是在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
}