C# / .NET messagebox is not modal

北战南征 提交于 2019-11-28 07:09:25

You need to assign the MessageBox owner property to the main UI window (look at the 3rd constructor).

JamesM

This is a simple C# new Windows Forms application:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string message = "You did not enter a server name. Cancel this operation?";
            string caption = "No Server Name Specified";
            MessageBoxButtons buttons = MessageBoxButtons.YesNo;
            DialogResult result;

            // Displays the MessageBox.
            result = MessageBox.Show(this, message, caption, buttons);
            if (result == DialogResult.Yes)
            {
                // Closes the parent form.
                this.Close();
            }
        }
    }
}

As Dusty states in his answer, a message box is a modal dialog. Specify the 'owner' property. In this example, the owner is denoted by the keyword 'this'.

To get system modal messagebox set MessageBoxOptions.DefaultDesktopOnly.

A modal pop-up is technically defined as a pop-up box that interrupts the normal flow of the application...not necessarily one that stays on the top of all other windows so the behavior you're describing is correct for a modal popup.

Modal Window

Here's a project on CodeProject that tries to mimic the "always on top" functionality for a MessageBox style Modal window:

CodeProject: TopMost MessageBox

Dusty

You can use the owner parameter to specify a particular object, which implements the IWin32Window interface, to place the message box in front of.

A message box is a modal dialog, which means no input (keyboard or mouse click) can occur except to objects on the modal form. The program must hide or close a modal form (typically in response to some user action) before input to another form can occur.

MessageBox.Show Method

This is working for me:

MessageBox.Show(Form.ActiveForm,"Finished processing", "Process finished", , MessageBoxButtons.OK, MessageBoxIcon.Information);

Form.ActiveForm would give you the currently active form, even if you are raising your MessageBox from any other class.

What I usually do if I have to trigger a MessageBox from another thread (not from the main thread) is this:

  1. I create a static variable with the form instance:

    private static Form1 myform;

  2. From the thread, I invoke the operation to show the MessageBox from the main thread:

    myform.BeginInvoke((MethodInvoker)delegate() { MessageBox.Show("Process finished!", "Thread Process Information", MessageBoxButtons.OK, MessageBoxIcon.Information); });

This is just a "cookie-cutter" that I always use, and works perfectly for me.

Max

Make the message box appear in the main thread, if your form has been created from it:

private bool ShowMessageBoxYesNo()
{
    if (this.InvokeRequired)
        return (bool)this.Invoke(new ShowMessageBoxYesNoDelegate(ShowMessageBoxYesNo));
    else
    {
        DialogResult res = MessageBox.Show("What ?", "Title", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        if (res == DialogResult.Yes)
            return true;
        else
            return false;
    }
}
public static System.Windows.Forms.DialogResult WW_MessageBox(string Message, string Caption,
        System.Windows.Forms.MessageBoxButtons buttons, System.Windows.Forms.MessageBoxIcon icon,
        System.Windows.Forms.MessageBoxDefaultButton defaultButton)
    {
        System.Windows.Forms.MessageBox.Show(Message, Caption, buttons, icon, defaultButton,
            (System.Windows.Forms.MessageBoxOptions)8192 /*MB_TASKMODAL*/);

    }
surya

MessageBox is a local control which is local for the server. And it does not respond until clicking OK on the message box which is displayed in the server.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!