如何显示带有详细信息和确定选项的消息框

时间:2013-08-27 09:28:24

标签: c# winforms

我想在表单中显示一个带有OkDetail按钮的消息框。我已经完成了此功能的一些代码,但它还显示了一个取消按钮,详细信息部分仅显示该消息我用字符串写的。代码是

var dialogTypeName = "System.Windows.Forms.PropertyGridInternal.GridErrorDlg";
var dialogType = typeof(M3Form).Assembly.GetType(dialogTypeName);

// Create dialog instance.
var dialog = (M3Form)Activator.CreateInstance(dialogType, new PropertyGrid());


// Populate relevant properties on the dialog instance.
dialog.Text = "Accknowledge Error";
dialogType.GetProperty("Details").SetValue(dialog, "Maximum length has been exceeded. Maximum = 50, Actual =" + txtName.Text.Length + "", null);
dialogType.GetProperty("Message").SetValue(dialog, "Maximum length has been exceeded. Maximum = 50, Actual =" + txtName.Text.Length + "", null);

// Display dialog.
var result = dialog.ShowDialog();

如何在详细信息部分中仅显示带有堆栈跟踪错误消息的OK按钮和详细信息按钮。

4 个答案:

答案 0 :(得分:3)

如果我理解正确,您希望将MessageBox上的默认OKCancel按钮更改为OKDetails。这需要太多的工作,如果不创建自己的MessageBox,就不能轻易做到。

IMO您最好创建一个看起来像MessageBox的新表单,并在每次需要显示邮件时显示。然后,您可以在显示ShowDialog时使用MessageBox Form,这样它就像一个类似于MessageBox的模态窗口。

答案 1 :(得分:1)

我知道这是一个老线程,你可能已经找到了答案。但只是想记录我的答案,供任何人使用。正如Christian所指出的那样,使用.NET框架的内部类是不明智的。但如果你真的想这样做,你可以这样做。

var cancelBtn = dialog.Controls.Find("cancelBtn", true);
cancelBtn[0].Visible = false;

虽然这会隐藏“取消”按钮,但这会使OK按钮在对话框的中心悬空。因此,如果您只想显示“确定”按钮,并且如果您不必关心对话框结果,则可以通过以下方式执行此操作:

var okBtn = dialog.Controls.Find("okBtn", true);
okBtn[0].Visible = false;

var cancelBtn = dialog.Controls.Find("cancelBtn", true);
cancelBtn[0].Text = okBtn[0].Text;

您可以自由地在表单上探索更多自定义,因为您已获得Form对象。

答案 2 :(得分:0)

这是一个内部类(因此命名空间名称和它是internal的事实,你甚至需要反思来首先访问它。)

使用.NET框架的内部类并不是很明智。他们可能会更改(或消失),恕不另行通知。此外,询问“它是如何工作”甚至文档都是毫无意义的。

考虑创建自己的对话框,如建议的@keyboardP,或者查看标准的Windows任务对话框组件(从Windows Vista开始提供)。 TaskDialog是一个本机组件,您(最终)需要P / Invoke才能使用它。这项工作已经完成(多次),只需在Google或SO上搜索TaskDialog .NET

使用TaskDialog还有一个额外的好处,即用户可以识别它,因为Windows本身会在整个地方使用它。

如果你有使用P / Invoke的问题/限制,你也可以选择managed code中的一个重新实现。

答案 3 :(得分:0)

试试这个

// 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 = "Data Patch";
dialogType.GetProperty("Details").SetValue(dialog, "Sample Text", null);
dialogType.GetProperty("Message").SetValue(dialog, "Sample Text", null);

// Display dialog.
var result = dialog.ShowDialog();