Search code examples
c#.netwinformsmessagebox

How can I show a message box with details in WinForms?


Just now I noticed that Visual Studio shows a message box with details when a property is set to an invalid value. For example:

Is it possible to make this type of message box in WinForms?

I have tried the following code:

MessageBox.Show("Error in Division Fill.\n" + ex.Message,
                "Information",            
                MessageBoxButtons.OK,
                MessageBoxIcon.Information,
                MessageBoxOptions.RightAlign);

But this produced the following error:

Error 24 The best overloaded method match for 'System.Windows.Forms.MessageBox.Show(string, string, System.Windows.Forms.MessageBoxButtons, System.Windows.Forms.MessageBoxIcon, System.Windows.Forms.MessageBoxDefaultButton)' has some invalid arguments

G:\Jagadeeswaran\Nov 17\MCS-SPS School\MCS-SPS School\Certificate\Transfer.cs 164 21 MCS-SPS School

How can I fix this error and get a message box that shows additional details?


Solution

  • As others have pointed out, you should write a custom dialog with the desired features. For help on this, you can look at the actual implementation used by the PropertyGrid for this dialog (perhaps with a decompiler) , which is, as of .NET 4.0, the System.Windows.Forms.PropertyGridInternal.GridErrorDlg type, internal to the System.Windows.Forms assembly.

    I really wouldn't recommend it (could break in a future release), but if you're feeling really lazy, you can directly use this internal type using reflection.

    // Get reference to the dialog type.
    var dialogTypeName = "System.Windows.Forms.PropertyGridInternal.GridErrorDlg";
    var dialogType = typeof(Form).Assembly.GetType(dialogTypeName);
    
    // Create dialog instance.
    var dialog = (Form)Activator.CreateInstance(dialogType, new PropertyGrid());
    
    // Populate relevant properties on the dialog instance.
    dialog.Text = "Sample Title";
    dialogType.GetProperty("Details").SetValue(dialog, "Sample Details", null);
    dialogType.GetProperty("Message").SetValue(dialog, "Sample Message", null);
    
    // Display dialog.
    var result = dialog.ShowDialog();
    

    Result:

    Details Dialog