2011-12-28 128 views
17

刚才我注意到,当一个属性设置为无效值时,Visual Studio会显示一个消息框,其中包含详细信息。例如:如何在WinForms中显示带有详细信息的消息框?

是否有可能作出的WinForms这种类型的消息框?

我曾尝试下面的代码:

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

但是,这将产生以下错误:

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

我怎样才能解决这个错误,并得到一个消息框,显示额外的细节?

+6

这自定义对话框;你不能通过使用标准的'MessageBox.Show'重载之一来得到它。 – 2011-12-28 08:17:00

+0

谢谢。那么MessageBoxOptions在那里有什么用处。 – Sagotharan 2011-12-28 09:23:09

+1

'MessageBoxOptions'记录在[这里](http://msdn.microsoft.com/en-us/library/system.windows.forms.messageboxoptions.aspx)。我不确定你为什么认为'RightAlign'与显示“Details”有什么关系。它只是简单地使消息框中的文本与右侧对齐,就像在RTL系统上一样。 – 2011-12-28 09:24:48

回答

24

正如其他人所指出的,您应该编写一个具有所需功能的自定义对话框。有关此方面的帮助,可以查看PropertyGrid对于此对话框(可能是反编译器)使用的实际实现,它是.NET 4.0的System.Windows.Forms.PropertyGridInternal.GridErrorDlg类型,它位于System.Windows.Forms程序集的内部。

真的不会推荐它(可能在未来的版本中打破),但如果你感觉真的很懒,你可以直接使用这种内部类型使用反射。

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

结果

Details Dialog

+1

如果我不想在这个消息框中取消选项,我该怎么办? – 2013-08-26 18:52:07

10

您需要设置Form的以下属性来创建自定义对话框/消息窗口。

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

现在,使用ShowDialog()方法来显示自定义对话框。

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

有关对话框的详细信息,请阅读MSDN文章 - Dialog Boxes (Visual C#)

+0

基于这个答案,我写了自定义表单。看看这里:http://stackoverflow.com/a/40469355/3314922 – gneri 2016-11-15 22:18:28

3

只写自己的对话框,没有超载像你想展示方法。

0

你可以简单地这样做:

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

的文本 “” 是 “Adicionar Fotografia”。

注意:在编辑器中运行时运行应用程序(.exe)时,此代码正常工作,它不起作用并且有意义。

This is an example of the code above

+0

虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文可提高其长期价值。 – ryanyuyu 2016-03-21 13:01:37

1

基于@ AVD的答案上面(我upvoted)我写了以下内容。将它粘贴到你使用VS模板生成的表单中,它应该可以工作,也许只需要很少的调整。

我的代码:

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

设计自动生成的代码(它应该给你就放什么形式,如果你不想粘贴的想法):

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