如何在WinForms中显示包含详细信息的消息框?

刚才我注意到,当属性设置为无效值时,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 \ 11月17日\ MCS-SPS学校\ MCS-SPS学校\证书\ Transfer.cs 164 21 MCS-SPS学校

如何修复此错误并获取显示其他详细信息的消息框?

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

真的不推荐它(可以在将来的版本中破解),但是如果你感觉很懒,你可以直接使用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(); 

结果

详细信息对话框

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

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

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

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

有关Dialog read MSDN文章的更多信息 – 对话框(Visual C#)

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

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

我的代码:

 using System; using System.Windows.Forms; namespace MessageBoxWithDetails { ///  /// A dialog-style form with optional colapsable details section ///  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)); } } ///  /// Meant to give the look and feel of a regular MessageBox ///  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 { ///  /// Required designer variable. ///  private System.ComponentModel.IContainer components = null; ///  /// Clean up any resources being used. ///  /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code ///  /// Required method for Designer support - do not modify /// the contents of this method with the code editor. ///  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; } } 

你可以这样做:

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

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

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

这是上面代码的一个例子

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