2011-02-03 65 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創建一個屬性,因爲密碼只是臨時必需的一部分數據,所以沒有意義。