2008-08-31 88 views
6

所以现在我的项目有一些自定义对话框,可以像提示用户提供他的生日一样,或者其他什么。现在他们只是做一些事情,如设置this.Birthday属性,一旦他们得到一个答案(这是类型DateTime?,空指示“取消”)。然后,调用者检查它创建的对话框的Birthday属性以确定用户应答的内容。有没有一种标准的方法来从Windows窗体中的自定义对话框返回值?

我的问题是,有没有一个更标准的模式来做这样的事情?我知道我们可以设置this.DialogResult为基本的确定/取消的东西,但是在Windows窗体中是否有一种更通用的方式来表示“这是我收集的数据”?

回答

9

我会说暴露你的自定义对话框属性是惯用的方式,因为这是标准对话框(如选择/ OpenFileDialog)如何做到这一点。有人可能会认为它更明确,并且意图揭示具有返回所需结果的ShowBirthdayDialog()方法,但遵循框架模式可能是明智的选择。

+0

让ShowBirthdayDialog()方法返回Cancel或OK返回将会更实用。按照框架的模式使用属性绝对会更好。 很好的答案。 – 2008-09-25 11:27:30

0

我一直按照你描述的方式完成它。我很好奇,看看是否有更为接受的方法。

3

有没有更像标准的模式?

不,这听起来像是你正在使用正确的方法。

如果对话框返回DialogResult.OK,则假定对话框中所有必需的属性都是有效的。

2

对于我来说,坚持使用对话框返回标准对话框响应,然后通过属性访问结果是一条路。从

两个很好的理由,我坐下:

  1. 一致性 - 你总是做同样的事情用一个对话框,问题的性质表明,模式是很好的( - :虽然同样的问题是否这是一个好的模式?
  2. 它允许从对话框中返回多个值 - 好的,这里也有全新的讨论,但实用主义意味着这是人们在某些情况下并不总是合适或需要打包只是为了让你可以一次过把它们传回去。

逻辑的流程是太好:

if (Dialog == Ok) 
{ 
    // Do Stuff with the entered values 
} 
else 
{ 
    // Respond appropriately to the user cancelling the dialog 
} 

它一个很好的问题 - 我们应该质疑这样的东西 - 但对我来说,目前的格局是一个体面的一个。

墨菲

1

对于模态输入对话框,我通常超载的ShowDialog并通过OUT参数,为我所需要的数据。

DialogResult ShowDialog(out datetime birthday) 

我通常发现它更容易发现和了解VS与100+的Form类混合暴露我的财产。

对于窗体,我通常有一个Controller和一个IView接口,它使用只读属性来传递数据。