是否有从 Windows 窗体中的自定义对话框返回值的标准方法?

Posted

技术标签:

【中文标题】是否有从 Windows 窗体中的自定义对话框返回值的标准方法?【英文标题】:Is there a standard way to return values from custom dialogs in Windows Forms? 【发布时间】:2010-09-07 09:50:26 【问题描述】:

所以现在我的项目有一些自定义对话框,可以执行诸如提示用户生日等操作。现在他们只是在做一些事情,比如在他们得到答案后设置一个this.Birthday 属性(类型为DateTime?,null 表示“取消”)。然后调用者检查它创建的对话框的Birthday 属性以确定用户回答了什么。

我的问题是,有没有更标准的模式来做这样的事情?我知道我们可以为基本的 OK/Cancel 设置 this.DialogResult,但在 Windows 中有更通用的方法吗?用于指示“这是我收集的数据”的表单?

【问题讨论】:

【参考方案1】:

我会说在您的自定义对话框上公开属性是惯用的方式,因为标准对话框(如 Select/OpenFileDialog)就是这样做的。有人可能会争辩说,使用 ShowBirthdayDialog() 方法返回您正在寻找的结果会更加明确和意图揭示,但遵循框架的模式可能是明智的选择。

【讨论】:

让 ShowBirthdayDialog() 方法返回是否返回 Cancel 或 OK 会更实用。根据框架的模式使用属性肯定更好。很好的答案。【参考方案2】:

有没有更标准的模式来做这样的事情?

不,听起来您使用的是正确的方法。

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

【讨论】:

【参考方案3】:

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

我坐的两个很好的理由:

    一致性 - 您总是在对话中做同样的事情,问题的本质表明模式是好的(-:虽然同样的问题是这是否是一个好的模式? 它允许从对话框中返回多个值 - 好的,这里也有全新的讨论,但应用实用主义意味着在某些情况下这是人们想要的,它并不总是适合或不希望将值打包以便您可以通过一口气将它们全部归还。

逻辑流程也不错:

if (Dialog == Ok)

    // Do Stuff with the entered values

else

    // Respond appropriately to the user cancelling the dialog

这是一个很好的问题——我们应该质疑这样的事情——但对我来说,目前的模式是一个不错的模式。

墨菲

【讨论】:

【参考方案4】:

对于模态输入对话框,我通常重载 ShowDialog 并为我需要的数据传递参数。

DialogResult ShowDialog(out datetime birthday)

我通常发现发现和理解比将我的属性与 Form 类公开的 100 多个属性混合起来更容易。

对于表单,我通常有一个 Controller 和一个使用只读属性传递数据的 IView 接口。

【讨论】:

【参考方案5】:

我一直都是按照你描述的方式做的。我很想知道是否有更被接受的方法。

【讨论】:

以上是关于是否有从 Windows 窗体中的自定义对话框返回值的标准方法?的主要内容,如果未能解决你的问题,请参考以下文章

文件属性对话框中的自定义选项卡

Windows 窗体中的提示对话框

Windows 窗体和 C# 中的动态自上而下的控件列表?

Windows 窗体中是不是有内置确认对话框?

PyQt4:创建返回参数的自定义对话框

Qt中的自定义QDialog