简体   繁体   中英

Form in C# returns DialogResult.Cancel to Parent When It is Minimized

I have a form "Main" and in Main I am creating another form which I use .ShowDialog() to display it. I do this because I don't want the rest of the code to in Main to execute until after the new form is completed. I am allowing a user to minimize the new form to system tray.

The problem: When the form gets minimized it is returning DialogResult.Cancel to the Main form that called it, causing the next line to run early.

Code to create form from Main form:

    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());
    }

In the new form a user will get a list of files that copy... now the user can continue and copy those files and I would expect to return a result of OK and if not I assume they are going to cancel and return Cancel...

Is my only recourse to return Abort from the new form if a user specifies a cancel and assume that a cancel is someone trying to minimize? This just seems odd

This is entirely by design. When you hide a modal dialog, the user doesn't have any way to get back to the program. Dialogs don't have a taskbar button and the rest of the windows in the app are disabled so cannot be activated. The only recourse the user would have is to kill your program with Task Manager.

So Winforms does the logical thing, it automatically closes the dialog to avoid this UI trap. And of course you'll get DialogResult.Cancel.

Use proper UI design, a dialog should always have its MinimizeBox property set to False.

I'm not sure what you are trying to achieve with that. However, to get the Dialog to return anything else, you have to set it in the form's (Dialog's) DialogResult property before the form is closed.

You may also use the Form_Closing event of the dialog to set the DialogResult property to what you want. This is done before the form closes.

You could handle this in a number of ways, one way is like what follows:

    MainTestForm mainTestForm = new MainTestForm();

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

You must set the DialogResult state when you close the form like

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

I hope this helps.

Here is a quote from MSDN regarding ShowDialog:

When this method is called, the code following it is not executed until after the dialog box is closed.

After further reading it does state the X does not close the form but hides it and so you must dispose of it:

When a form is displayed as a modal dialog box, clicking the Close button (the button with an X in the top-right corner of the form) causes the form to be hidden and the DialogResult property to be set to DialogResult.Cancel. The Close method is not automatically called when the user clicks the Close button of a dialog box or sets the value of the DialogResult property. Instead, the form is hidden and can be shown again without creating a new instance of the dialog box. Because of this behavior, you must call the Dispose method of the form when the form is no longer needed by your application.

It seems this same issues applies to minimizing a userform as well.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM