1

我想在表单中显示一个带有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();

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

4

4 回答 4

3

如果我理解正确,您希望将MessageBox 上的默认值OK和按钮更改为and 。这需要太多的工作,而且如果不创建自己的 MessageBox 就无法轻松完成。CancelOKDetails

IMO,您最好创建一个看起来像 a 的新表单,MessageBox并在每次需要显示消息时显示该表单。然后,您可以ShowDialog在显示时使用MessageBox Form它,使其成为类似于 MessageBox 的模式窗口。

于 2013-08-27T09:34:24.700 回答
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 对象。

于 2015-12-18T13:17:45.707 回答
0

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

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

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

使用 TaskDialog 的另一个好处是用户可以识别它,因为 Windows 本身在所有地方都使用它。

如果您在使用 P/Invoke 时遇到问题/限制,您还可以选择托管代码中的重新实现之一。

于 2013-08-27T10:03:42.073 回答
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();
于 2016-07-08T06:09:20.747 回答