2011-12-28 16 views
17

Ahora me di cuenta de que Visual Studio muestra un cuadro de mensaje con detalles cuando una propiedad se establece en un valor no válido. Por ejemplo:¿Cómo puedo mostrar un cuadro de mensaje con detalles en WinForms?

¿Es posible hacer este tipo de cuadro de mensaje en WinForms?

He intentado el siguiente código:

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

Pero esto produjo el siguiente 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

¿Cómo puedo corregir este error y obtener un cuadro de mensaje que muestra detalles adicionales?

+6

Eso es un diálogo personalizado; no puede obtenerlo utilizando una de las sobrecargas estándar de 'MessageBox.Show'. –

+0

Gracias. entonces, ¿cuál es el uso de MessageBoxOptions en eso? – Sagotharan

+1

Las 'MessageBoxOptions' están documentadas [aquí] (http://msdn.microsoft.com/en-us/library/system.windows.forms.messageboxoptions.aspx). No estoy seguro de por qué pensaste que 'RightAlign' tenía algo que ver con mostrar "Detalles". Simplemente hace que el texto en el cuadro de mensaje se alinee a la derecha, como en un sistema RTL. –

Respuesta

24

Como han señalado otros, debe escribir un cuadro de diálogo personalizado con las funciones deseadas. Para obtener ayuda sobre esto, puede ver la implementación real utilizada por el PropertyGrid para este cuadro de diálogo (quizás con un descompilador), que es, a partir de .NET 4.0, el tipo System.Windows.Forms.PropertyGridInternal.GridErrorDlg, interno al ensamblado System.Windows.Forms.

I realmente no lo recomendaría (podría romperse en versiones futuras), pero si se siente realmente flojo, puede usar este tipo interno mediante reflexión.

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

Resultado:

Details Dialog

+1

si no quiero cancelar la opción en este cuadro de mensaje, ¿Qué tengo que hacer? –

10

Debe establecer las propiedades siguientes de Form para crear una ventana de diálogo/mensaje personalizada.

  1. AcceptButton
  2. CancelButton
  3. FormBorderStyle = FixedDialog
  4. MaximizeBox = False
  5. MinimizeBox = False
  6. ShowIcon = False
  7. ShowInTaskBar = False
  8. StartPosition = CenterParent

Ahora, use el método ShowDialog() para mostrar el cuadro de diálogo personalizado.

MyDialog dialog=new MyDialog(); 
DialogResult result=dialog.ShowDialog(); 
if(result == DialogResult.OK) 
{ 
    // 
} 

Para obtener más información sobre Diálogo leer artículo de MSDN - Dialog Boxes (Visual C#)

+0

Basado en esta respuesta escribí el formulario personalizado. Mira aquí: http://stackoverflow.com/a/40469355/3314922 – gneri

3

acaba de escribir su propio diálogo, no hay sobrecarga como usted quiere mostrar método.

0

Usted puede simplemente hacer esto:

catch (Exception error) 
{ 
    throw new Exception("Error with details button! \n"+error); 
} 

El texto en "" es "Adicionar Fotografía".

Nota: este código funciona bien cuando se ejecuta la aplicación (.exe) mientras se ejecuta en el editor, no funciona y tiene sentido.

This is an example of the code above

+0

Si bien este código puede responder a la pregunta, proporcionar un contexto adicional con respecto a por qué y/o cómo responde este código a la pregunta mejora su valor a largo plazo. – ryanyuyu

1

Basado en la respuesta de @ AVD anterior (que subí), escribí lo siguiente. Pegue esto en un formulario generado con una plantilla VS y debería funcionar, quizás con algunos ajustes.

Mi código:

using System; 
using System.Windows.Forms; 

namespace MessageBoxWithDetails 
{ 
    /// <summary> 
    /// A dialog-style form with optional colapsable details section 
    /// </summary> 
    public partial class MessageBoxWithDetails : Form 
    { 
     private const string DetailsFormat = "Details {0}"; 

    public MessageBoxWithDetails(string message, string title, string details = null) 
    { 
     InitializeComponent(); 

     lblMessage.Text = message; 
     this.Text = title; 

     if (details != null) 
     { 
      btnDetails.Enabled = true; 
      btnDetails.Text = DownArrow; 
      tbDetails.Text = details; 
     } 
    } 

    private string UpArrow 
    { 
     get 
     { 
      return string.Format(DetailsFormat, char.ConvertFromUtf32(0x25B4)); 
     } 
    } 

    private string DownArrow 
    { 
     get 
     { 
      return string.Format(DetailsFormat, char.ConvertFromUtf32(0x25BE)); 
     } 
    } 

    /// <summary> 
    /// Meant to give the look and feel of a regular MessageBox 
    /// </summary> 
    public static void Show(string message, string title, string details = null) 
    { 
     new MessageBoxWithDetails(message, title, details).ShowDialog(); 
    } 

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 

     // Change these properties now so the label is rendered so we get its real height 
     var height = lblMessage.Height; 
     SetMessageBoxHeight(height); 
    } 

    private void SetMessageBoxHeight(int heightChange) 
    { 
     this.Height = this.Height + heightChange; 
     if (this.Height < 150) 
     { 
      this.Height = 150; 
     } 
    } 

    private void btnClose_Click(object sender, EventArgs e) 
    { 
     this.Close(); 
    } 

    private void btnDetails_Click(object sender, EventArgs e) 
    { 
     // Re-anchoring the controls so they stay in their place while the form is resized 
     btnCopy.Anchor = AnchorStyles.Top; 
     btnClose.Anchor = AnchorStyles.Top; 
     btnDetails.Anchor = AnchorStyles.Top; 
     tbDetails.Anchor = AnchorStyles.Top; 

     tbDetails.Visible = !tbDetails.Visible; 
     btnCopy.Visible = !btnCopy.Visible; 

     btnDetails.Text = tbDetails.Visible ? UpArrow : DownArrow; 

     SetMessageBoxHeight(tbDetails.Visible ? tbDetails.Height + 10 : -tbDetails.Height - 10); 
    } 

    private void btnCopy_Click(object sender, EventArgs e) 
    { 
     Clipboard.SetText(tbDetails.Text); 
    } 
} 

diseñador de automóviles código generado (que debería darle una idea acerca de qué poner en el formulario si no desea pegar):

namespace MessageBoxWithDetails 
{ 
    partial class MessageBoxWithDetails 
    { 
     /// <summary> 
     /// Required designer variable. 
     /// </summary> 
     private System.ComponentModel.IContainer components = null; 
     /// <summary> 
     /// Clean up any resources being used. 
     /// </summary> 
     /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
     protected override void Dispose(bool disposing) 
     { 
      if (disposing && (components != null)) 
      { 
       components.Dispose(); 
      } 
      base.Dispose(disposing); 
     } 

     #region Windows Form Designer generated code 

     /// <summary> 
     /// Required method for Designer support - do not modify 
     /// the contents of this method with the code editor. 
     /// </summary> 
     private void InitializeComponent() 
     { 
      this.btnClose = new System.Windows.Forms.Button(); 
      this.btnDetails = new System.Windows.Forms.Button(); 
      this.btnCopy = new System.Windows.Forms.Button(); 
      this.lblMessage = new System.Windows.Forms.Label(); 
      this.tbDetails = new System.Windows.Forms.TextBox(); 
      this.SuspendLayout(); 
      // 
      // btnClose 
      // 
      this.btnClose.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
      | System.Windows.Forms.AnchorStyles.Right))); 
      this.btnClose.Location = new System.Drawing.Point(267, 37); 
      this.btnClose.Name = "btnClose"; 
      this.btnClose.Size = new System.Drawing.Size(75, 23); 
      this.btnClose.TabIndex = 0; 
      this.btnClose.Text = "Close"; 
      this.btnClose.UseVisualStyleBackColor = true; 
      this.btnClose.Click += new System.EventHandler(this.btnClose_Click); 
      // 
      // btnDetails 
      // 
      this.btnDetails.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
      | System.Windows.Forms.AnchorStyles.Right))); 
      this.btnDetails.Enabled = false; 
      this.btnDetails.Location = new System.Drawing.Point(12, 37); 
      this.btnDetails.Name = "btnDetails"; 
      this.btnDetails.Size = new System.Drawing.Size(75, 23); 
      this.btnDetails.TabIndex = 1; 
      this.btnDetails.Text = "Details"; 
      this.btnDetails.UseVisualStyleBackColor = true; 
      this.btnDetails.Click += new System.EventHandler(this.btnDetails_Click); 
      // 
      // btnCopy 
      // 
      this.btnCopy.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 
      | System.Windows.Forms.AnchorStyles.Right))); 
      this.btnCopy.Location = new System.Drawing.Point(93, 37); 
      this.btnCopy.Name = "btnCopy"; 
      this.btnCopy.Size = new System.Drawing.Size(102, 23); 
      this.btnCopy.TabIndex = 4; 
      this.btnCopy.Text = "Copy To Clipboard"; 
      this.btnCopy.UseVisualStyleBackColor = true; 
      this.btnCopy.Visible = false; 
      this.btnCopy.Click += new System.EventHandler(this.btnCopy_Click); 
      // 
      // lblMessage 
      // 
      this.lblMessage.AutoSize = true; 
      this.lblMessage.Location = new System.Drawing.Point(12, 9); 
      this.lblMessage.MaximumSize = new System.Drawing.Size(310, 0); 
      this.lblMessage.Name = "lblMessage"; 
      this.lblMessage.Size = new System.Drawing.Size(35, 13); 
      this.lblMessage.TabIndex = 5; 
      this.lblMessage.Text = "label1"; 
      // 
      // tbDetails 
      // 
      this.tbDetails.Anchor = System.Windows.Forms.AnchorStyles.Bottom; 
      this.tbDetails.Location = new System.Drawing.Point(12, 68); 
      this.tbDetails.MaximumSize = new System.Drawing.Size(328, 100); 
      this.tbDetails.Multiline = true; 
      this.tbDetails.Name = "tbDetails"; 
      this.tbDetails.ReadOnly = true; 
      this.tbDetails.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; 
      this.tbDetails.Size = new System.Drawing.Size(328, 100); 
      this.tbDetails.TabIndex = 6; 
      this.tbDetails.Visible = false; 
      // 
      // MessageBoxWithDetails 
      // 
      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
      this.ClientSize = new System.Drawing.Size(354, 72); 
      this.Controls.Add(this.tbDetails); 
      this.Controls.Add(this.lblMessage); 
      this.Controls.Add(this.btnCopy); 
      this.Controls.Add(this.btnDetails); 
      this.Controls.Add(this.btnClose); 
      this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 
      this.MaximizeBox = false; 
      this.MinimizeBox = false; 
      this.Name = "MessageBoxWithDetails"; 
      this.ShowIcon = false; 
      this.ShowInTaskbar = false; 
      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 
      this.ResumeLayout(false); 
      this.PerformLayout(); 

     } 

     #endregion 

     private System.Windows.Forms.Button btnClose; 
     private System.Windows.Forms.Button btnDetails; 
     private System.Windows.Forms.Button btnCopy; 
     private System.Windows.Forms.Label lblMessage; 
     private System.Windows.Forms.TextBox tbDetails; 
    } 
} 
Cuestiones relacionadas