【问题标题】:WinForm window sometimes arbitrarily setting its DialogResult variable to Cancel immediately after ShowDialogWinForm 窗口有时会在 ShowDialog 之后立即将其 DialogResult 变量任意设置为 Cancel
【发布时间】:2016-06-15 16:58:59
【问题描述】:

正如标题所说,我有一个 WinForms 窗口,它有时会在调用 ShowDialog 后立即将其 DialogResult 属性设置为 Cancel

窗口显示如下:

bool isSuccess = (ShowDialog() == System.Windows.Forms.DialogResult.OK);

现在大多数时候,DialogResult 在第一次实例化窗口时设置为None,这是应该的。在这些情况下,窗口将保持打开/活动状态,直到 DialogResult 设置为 None 以外的其他值。

我什至把这个函数改成这样:

this.DialogResult = System.Windows.Forms.DialogResult.None;
bool isSuccess = (ShowDialog() == System.Windows.Forms.DialogResult.OK);

但有时,DialogResult 会立即变为Cancel

我的代码中没有任何地方在任何地方、任何时间设置或与DialogResult 属性交互,当它自动设置为Cancel 时。

此外,如果我在调用 ShowDialog 后立即中断行,则导致 ShowDialog 调用的整个堆栈跟踪相同 - 逐行。

鉴于实际上没有任何东西与 DialogResult 属性交互,我完全不知道如何阻止它。

【问题讨论】:

  • 为 FormClosing 事件添加事件处理程序并在其上设置断点。堆栈跟踪可能会给出提示。请记住,如果您将其隐藏或它的所有者窗口消失,对话框总是会在没有您帮助的情况下自动关闭。
  • 您可以将 ShowDialog 与重载一起使用,该重载将您希望成为其所有者的表单作为参数,并查看您是否有相同的行为
  • 我将测试 FormClosing 事件的样子,但重现该行为可能需要一些时间,因为它仅发生大约 10% 的时间。在任何人问之前,不,10% 或任何 % 的时间都没有什么不同。
  • 我们只是在玩猜谜游戏。如果您需要更多帮助,请提供minimal verifiable example。没有这个,这真的不是一个可以回答的问题。我相信我们大多数从事 Windows 窗体开发多年的人都可以证明它不会自行随机更改。您的代码在某些地方还有更多我们没有在这里看到的地方。
  • @Justin,这里只有两个选项。要么你的代码是错误的,你只是因为没有共享足够多的代码来让任何人帮助你而变得不可能,或者微软最受欢迎的库之一拒绝只使用你正确编写的代码。您似乎确信这是第二种选择,在这种情况下,您对这里的任何人有什么期望?您是否希望有人为您向 Microsoft 报告错误?

标签: c# winforms


【解决方案1】:

你是如何关闭窗口的?如果使用 X 关闭它,结果会自动设置为 DialogResult.Cancel(请参阅here

当窗体显示为模式对话框时,单击关闭按钮(窗体右上角带有 X 的按钮)会导致窗体隐藏并将 DialogResult 属性设置为 DialogResult。取消。当用户单击对话框的关闭按钮或设置 DialogResult 属性的值时,不会自动调用 Close 方法。相反,该表单被隐藏并且可以在不创建对话框的新实例的情况下再次显示。由于这种行为,当您的应用程序不再需要该表单时,您必须调用该表单的 Dispose 方法。

编辑: 如果我理解正确,您还提到它“在第一次实例化时”可以正常工作。这是否意味着您在关闭后重新使用相同的表单?如果是这样,则不支持此功能。关闭后,您必须创建表单的新实例才能再次显示它。

【讨论】:

  • 我想我的问题应该够清楚了。我没有关上窗户。我打电话给ShowDialog,然后窗口立即关闭,因为DialogResult 属性有时会神奇地设置为Cancel
  • 我在您的消息中没有看到您提到您自己根本没有关闭表单的任何地方。还有其他事情发生 - Windows 窗体并不“神奇”。如果窗口正在关闭,则说明某些东西正在告诉它到某个地方。
  • 我认为这肯定是神奇的,因为这种行为只有大约 10-20% 的时间被见证,而达到这一点的工作流/输入是从不 i> 不同。无论如何,如果我自己关上窗户,显然我不会有问题......
  • 计算机程序从来都不是神奇的——它们总是以可预测的方式完全按照他们的指示行事。您必须从假设开始,即如果您的行为有所不同,则意味着某处存在差异。您只需要确定区别是什么。
  • 然而我面前有相反的证据!无论如何,也许其他人可以提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多