2010-06-20 86 views
1

在C#中,使用CF,你如何顯示一個已經有一個先前實例加載到內存中的窗口?訪問已經實例化的窗體

例如: Form1有一個textBox1和一個按鈕。一些文本被輸入到texBox1中。 Form1的按鈕單擊加載Form2,它也有一個按鈕。單擊Form 2的按鈕調用Form 3。你如何調用已經運行的Form1實例來調用它的updateField方法?

回答

1

只需在某處保留對Form1實例的引用 - 例如,當你構造它時將它傳入Form2,然後Form2可以將它傳遞給Form3使用。

在這裏沒有什麼特別的UI控件 - 只要想想如果你想訪問任何其他類型的對象你會怎麼做。

+0

實際上,情況更復雜 我有一個自定義控件類,並在form1中,我從它做更多的實例。並且此自定義控件調用form2。所以主要的問題是要訪問自定義控件的表單 customcontrol的父級是一個列表框。 它應該工作:control.Parent.Parent? – arnoldino 2010-06-20 08:15:18

+0

你有沒有嘗試過使用'Control.FindForm()'?如果這不起作用,您應該回到我的建議:在任何需要的地方傳遞信息。再次想一想,如果你不處理UI情況,你會怎麼做。 – 2010-06-20 08:25:27

1

你這樣做的事件。 Form3應該有一個公開的屬性來公開該值以及當值發生變化時觸發的事件。 Form2應該訂閱該事件,以便它可以跟蹤更改。重複讓Form1知道。

這種去耦合類,Form3不必知道Form2的Form1中也沒有什麼,只是有人可能會感興趣的屬性值。重構這些父窗體類不能打破Form3。請注意Windows窗體控件類如何以相同的方式工作。

+0

現在*那*是一個正確的答案。一個表單如何直接從另一個表單獲取信息?它不應該。我甚至可能會建議一個Controller或Presenter是中介,那麼Forms甚至不需要知道彼此的存在。 – ctacke 2010-06-20 15:51:13