2011-02-03 45 views
3

在决定问这个问题之前,我已经对这个问题做了一些研究。我找不到任何帮助我的东西。如何将一个对象从form1传递给form2并返回form1?

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

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

我明白,表单只是一个对象,我也明白,对象是通过引用过去而不是通过价值。我也了解这两种类型的区别。由于某种原因,我无法完成工作。

什么是最好的,最清洁的代码方式来实现这一目标?

+0

这是你正在谈论的WinForms? – 2011-02-03 15:08:45

+0

[C#中两个窗体之间的通信]的可能重复(http://stackoverflow.com/questions/1665533/communicate-between-two-windows-forms-in-c)和许多其他许多人。 – 2011-02-03 15:17:51

+0

http://stackoverflow.com/q/4373660/60761,http://stackoverflow.com/q/3034493/60761 – 2011-02-03 15:20:26

回答

4

你需要做的是创建第二个构造函数到你的第二个表单接受一个对象作为参数......对于我所关心的所有人来说,它可能是整个Form1对象实例,那么你可以得到你想要的任何东西它。以第二种形式保留该对象,并根据需要对其进行修改。完成第二张表格后,您的第一张表格将具有该数据,一旦第二张表格关闭,您就可以执行任何“刷新”操作。

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


} 
2

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

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

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

0

像这样的事情在ObservableForm是一个基类,包含了进一步的flexability的的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); 

    } 

}

0

我要给你一个有趣的解决方案,包括关闭。在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); 
    } 
} 

我用在以下情况下此实现:我不得不向用户请求一个密码,我想用一个对话框,这样做,所以我设计我的对话框用用户可以输入密码的文本框,以及确定和取消按钮。在FormClosing上,我会通过调用Action来返回字符串(他们的密码),并且我只会使用该Form作为对话框,所以我可以确定该变量在代码继续时被分配给一个字符串Form1上。这样我就不必为Password创建一个属性,因为密码只是临时必需的一部分数据,所以没有意义。