我想在表单中显示一个带有Ok
和Detail
按钮的消息框。我已经完成了此功能的一些代码,但它还显示了一个取消按钮,详细信息部分仅显示该消息我用字符串写的。代码是
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按钮和详细信息按钮。
答案 0 :(得分:3)
如果我理解正确,您希望将MessageBox上的默认OK
和Cancel
按钮更改为OK
和Details
。这需要太多的工作,如果不创建自己的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();