2008-11-01 63 views
2

我需要一個模式對話框來收集一些用戶輸入。然後我需要應用程序MainFrame使用相同的數據。在MainFrame(或主對話框)和Modal對話框之間傳遞數據的最佳方式是什麼?

通常,我的模態對話框會有一個指向某些DataType的指針,能夠存儲我需要的內容,並且我將通過MainFrame的引用傳遞此對象,以便能夠在模式對話框關閉時恢復數據用戶。

這是傳遞數據的最佳方式嗎?

它感覺不對!

回答

3

由於您在用戶關閉對話框(大概在DialogResult.OK)時傳遞數據,因此無需MainFrame引用即可輕鬆完成此操作。

所以假設你的對話框上有一個TextBox,名爲userNameTextBox,並且有一個按鈕,結束對話框並顯示OK結果。您可以將userNameTextBox設爲公共(不推薦)或添加屬性以返回文本。

public string UserName 
{ 
    get { return userNameTextBox.Text; } 
} 

和對話結束後獲得這個價值,你只是做:

Dialog dialog = new Dialog(); 
if (dialog.ShowDialog() == DialogResult.OK) 
{ 
    string username = dialog.UserName; 
} 
0

通常,您可以使用單個類或其他數據類型來傳輸數據。所以這個對話框用來改變這個類的屬性。爲什麼這感覺不對?

[幽默] 隨着大型機,我假設你並不是指大老(還活着和踢)電腦。否則,我認爲TCP/IP將是一個很好的選擇。 [/ humor]

+0

感覺不對,因爲這樣我會耦合邊界對象 – JohnIdol 2008-11-01 17:17:09

0

這樣做的最好方法是將數據打包到事件中並在事件總線上發送出去。

這會將對話框從大型機中分離出來 - 如果您正確設計事件,它不會限制您僅使用對話框。

根據語言和環境的不同,這個事件系統可以輕鬆便宜地實現。我打電話給我基於版本類的對象間通信。

+0

請例如... – Aheho 2008-11-01 17:13:20

+0

我正在尋找一種解耦邊界對象的方法 - 所以這種方法聽起來不錯。如果我在.NET環境上工作,我想我會將數據打包成某種EventArgs,那麼C++/MFC怎麼樣? – JohnIdol 2008-11-01 17:16:02

+0

解耦熱潮已經停止,它得到了「一切看起來像釘子」的比例。這個問題聽起來像一個簡單的應用程序,不需要這種過度工程 – 2008-11-01 18:20:05

1

@向用戶收集的一個或兩個值時,薩穆埃爾的建議是完全足夠了。

如果你得到很多值,那麼你的問題的解決方案也很好。

不要因爲過早優化和過度設計解耦解決方案而成爲犧牲品。通過邊界對象,我假設你指的是大型機和對話引用的數據結構實例。對話框和大型機都引用這個對象有什麼問題?在這種情況下解耦邊界/傳輸對象有什麼好處?

我在這裏可以看到的唯一解耦支付將使大型機與將數據傳遞給它的特定實現脫鉤。所以不是實例化Dialog並調用Dialog的大型機。的ShowModal,依賴注入將提供一種具有IDataYouNeedGetter(這會發生在相同模態對話框)主機和在適當的時間大型機會做

myGetter.SetTransferObject(dataStructInstance) 
myGetter.GoGetTheData() 
// do stuff with dataStructInstance now that myGetter set it up. 

BUT,沒有理由要添加一個間接層除非你已經知道解耦的具體需求。