【问题标题】:How can I show a message box with details in WinForms?如何在 WinForms 中显示带有详细信息的消息框?
【发布时间】:2011-12-28 08:14:40
【问题描述】:

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

是否可以在WinForms中制作这种类型的消息框?

我已经尝试了以下代码:

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

但这产生了以下错误:

错误 24 'System.Windows.Forms.MessageBox.Show(string, string, System.Windows.Forms.MessageBoxButtons, System.Windows.Forms.MessageBoxIcon, System.Windows.Forms.MessageBoxDefaultButton) 的最佳重载方法匹配' 有一些无效的参数

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

如何修复此错误并获得显示更多详细信息的消息框?

【问题讨论】:

  • 这是一个自定义对话框;您无法通过使用标准的MessageBox.Show 重载之一来获得它。
  • 谢谢。那么 MessageBoxOptions 有什么用呢。
  • MessageBoxOptions 记录在 here。我不确定您为什么认为RightAlign 与显示“详细信息”有任何关系。它只是使消息框中的文本向右对齐,就像在 RTL 系统上一样。

标签: c# .net winforms messagebox


【解决方案1】:

正如其他人所指出的,您应该编写一个包含所需功能的自定义对话框。有关这方面的帮助,您可以查看 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();

结果

【讨论】:

  • 如果我不想在这个消息框中取消选项,我该怎么办?
【解决方案2】:

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

  1. 接受按钮
  2. 取消按钮
  3. FormBorderStyle=FixedDialog
  4. 最大化框=假
  5. MinimizeBox=False
  6. ShowIcon=False
  7. ShowInTaskBar=False
  8. StartPosition=CenterParent

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

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

有关 Dialog 的更多信息,请阅读 MSDN 文章 - Dialog Boxes (Visual C#)

【讨论】:

【解决方案3】:

只需要编写你自己的对话框,没有你想显示方法的重载。

【讨论】:

    【解决方案4】:

    基于answer above(我赞成),我写了以下内容。将其粘贴到您使用 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;
        }
    }
    

    【讨论】:

      【解决方案5】:

      我也遇到了同样的问题。我建议你使用 windowsAPIcode 包。 这个网站将是一个很大的帮助。只需正确按照说明操作即可:http://www.developerfusion.com/article/71793/windows-7-task-dialogs/

      【讨论】:

        【解决方案6】:

        你可以这样做:

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

        “”中的文字是“Adicionar Fotografia”。

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

        这是上面代码的一个例子:

        【讨论】:

        • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
        猜你喜欢
        • 2011-08-01
        • 1970-01-01
        • 2022-01-24
        • 1970-01-01
        • 2011-11-01
        • 2016-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多