你如何将一个对象从form1传递给form2并返回form1?

在决定问这个问题之前,我已经对这个问题做了一些研究。 我找不到任何帮助我的东西。

我正在用C#编写一个紧凑框架2.0的应用程序。

我需要在form1上实例化一个数据对象,并将该对象传递给form2。 在form2中处理数据对象,然后将这些数据传回给form1,以便保存。

我明白,一个forms只是一个对象,我也明白,对象是通过引用过去,而不是价值。 我也明白这两种types的区别。 我只是因为某些原因无法工作。

什么是最好的,最干净的方式来实现这个代码?

你需要做的是创build第二个构造函数到你的第二个表单接受一个对象作为参数…对于我所关心的,它可能是整个Form1对象实例,那么你可以从它得到任何你想要的。 在第二种forms中保留这个对象,并根据需要修改它。 完成第二个表格后,您的第一个表格将具有该数据,一旦第二个表格closures,您可以执行任何“刷新”操作。

public partial class YourSecondForm : Form { object PreserveFromFirstForm; public YourSecondForm() { ... its default Constructor... } public YourSecondForm( object ParmFromFirstForm ) : this() { this.PreserveFromFirstForm = ParmFromFirstForm; } private void YourSecondFormMethodToManipulate() { // you would obviously have to type-cast the object as needed // but could manipulate whatever you needed for the duration of the second form. this.PreserveFromFirstForm.Whatever = "something"; } } 

我一直喜欢这个事件模型。 这样你的表单就不需要知道其他人了。 您可以在某种由两种表单使用的EventHandler类中设置类似以下的事件。

 public delegate void SavingObjectHandler(MyObject obj); public event SavingObjectHandler SavingObjectEvent; public void SavingObject(MyObject obj) { if (SavingObjectEvent != null) SavingObjectEvent(obj); } 

那么你的一个表单可以调用SavingObject甚至处理程序,另一个可以订阅SavingObjectEvent。 当第一个表单触发事件时,第二个表单将被通知做它需要的处理,然后在操作之后对象将再次被第一个表单所用。

像这样ObservableForm是一个基类,并包含ChangeEvent进一步的灵活性:

  public class FormMain : Form { private ObServableForm childForm = null; public FormMain () { this.childForm = new ObservableFormConcreateA(this); this.childForm.ChangeEvent += (sender, e) => Application.DoEvents(); } public void Present() { this.childForm.Show(); } } public class ObservableFormConcreateA ObServableForm { private Form workItemForm = null; private delegate void FormChangedHandler(object source, EventArgs args); //ToDo: this should go in the superclass public event FormChangedHandler ChangeEvent; public FormChild(ObServableFormworkItem) { this.workItemForm = workItem; } public void OnUserActionHandler(object sender, EventArgs e) { this.formItemForm.Property = this.txtBoxWhateverValue.Text; if(ChangeEvent != null) ChangeEvent(this, //create your args to specify which control/data changes); } 

}

我有一个有趣的解决scheme,涉及closures。 在Form2的构造函数中,需要一个Action<TypeOfThing>对象,并且每当需要将数据返回给Form1时,调用该Action并将数据传递给它。 例如:

 class Form1 : Form { private void SomeFunction() { TypeOfData data; Form2 form2 = new Form2((d) => { data = d; }); form2.ShowDialog() // or whatever you do with form2 // After you've definitely got your data object from Form2 DoStuff(data); } } class Form2 : Form { private Action<TypeOfData> returnData; private TypeOfData data; public Form2(Action<TypeOfData> r) { returnData = r; } private void SomeFunction() { // Whenever it comes time to return the data you've collected returnData(data); } } 

我在以下情况下使用了这个实现:我不得不从用户那里请求一个密码,而且我想用一个对话框来这么做,所以我devise了一个用户可以input密码的文本框的对话框,确定和取消button。 在FormClosing上,我会通过调用Action来返回string(他们的密码),而且我只会使用该Form作为对话框,所以我可以确定该variables在代码继续时被分配给一个stringForm1上。 这样我就不必为密码做一个属性了,因为密码只是暂时需要的一块数据,所以没有意义。