2008-11-01 66 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,没有理由要添加一个间接层除非你已经知道解耦的具体需求。