C#中的表单在最小化时将DialogResult.Cancel返回到Parent

时间:2013-11-27 21:22:55

标签: c# winforms

我有一个表单“Main”,在Main我正在创建另一个表单,我使用.ShowDialog()来显示它。我这样做是因为我不希望Main中的其余代码在新表单完成之后执行。我允许用户将新表单最小化到系统托盘。

问题:当表单最小化时,它将DialogResult.Cancel返回到调用它的Main表单,导致下一行提前运行。

从主窗体创建表单的代码:

    for(int i = 0; i < lvAll.SelectedItems.Count; i++)
    {
        this.Hide();
        this.run = new RunProfile(this.profiles[lvAll.SelectedItems[i].Text]);
        DialogResult result = run.ShowDialog();
        MessageBox.Show(result.ToString());
    }

在新表单中,用户将获得一个复制的文件列表...现在用户可以继续并复制这些文件,我希望返回OK的结果,如果不是,我认为他们将取消和返回取消...

如果用户指定取消并且假设取消是有人试图最小化的话,我是否唯一可以从新表格中退回Abort?这看起来很奇怪

4 个答案:

答案 0 :(得分:1)

这完全是设计上的。当您隐藏模式对话框时,用户无法回到该程序。对话框没有任务栏按钮,应用程序中的其余窗口都被禁用,因此无法激活。用户唯一的办法是使用任务管理器终止您的程序。

因此Winforms执行逻辑操作,它会自动关闭对话框以避免此UI陷阱。当然你会得到DialogResult.Cancel。

使用正确的UI设计,对话框应始终将其MinimizeBox属性设置为False。

答案 1 :(得分:0)

我不确定你想要实现的目标。但是,要使Dialog返回其他任何内容,必须在窗体关闭之前在窗体(Dialog)的DialogResult属性中设置它。

您还可以使用对话框的Form_Closing事件将DialogResult属性设置为您想要的。这是在表单关闭之前完成的。

答案 2 :(得分:0)

你可以通过多种方式解决这个问题,其中一种方式如下:

    MainTestForm mainTestForm = new MainTestForm();

    if (mainTestForm.ShowDialog() != System.Windows.Forms.DialogResult.OK)
    {
        return;
    }

关闭表单时必须设置DialogResult状态,如

    this.DialogResult = System.Windows.Forms.DialogResult.OK;

我希望这会有所帮助。

答案 3 :(得分:-1)

以下是MSDN关于ShowDialog的引用:

  

调用此方法时,不执行其后面的代码   直到对话框关闭后。

在进一步阅读之后,它确实声明X不会关闭表格但隐藏它,所以你必须处理它:

  

当表单显示为模式对话框时,单击“关闭”   按钮(表单右上角带有X的按钮)   导致隐藏窗体并设置DialogResult属性   到DialogResult.Cancel。不会自动调用Close方法   当用户单击对话框的“关闭”按钮或设置时   DialogResult属性的值。相反,表单是隐藏的   可以在不创建对话框的新实例的情况下再次显示。   由于此行为,您必须调用窗体的Dispose方法   当您的申请不再需要表格时。

似乎同样的问题也适用于最小化用户形式。