1

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] ボタンと [詳細] ボタンのみを表示するにはどうすればよいですか。

4

4 に答える 4

3

If I understand correctly, you want to change the default OK and Cancel buttons on a MessageBox to OK and Details. This requires too much work and isn't something you can easily do without creating your own MessageBox.

IMO you'd be better off creating a new Form that looks like a MessageBox and show that each time you need to display a message. You can then use ShowDialog when showing your MessageBox Form so that it's a modal window similar to a MessageBox.

于 2013-08-27T09:34:24.700 に答える
1

これは古いスレッドであり、すでに答えを見つけているかもしれません。しかし、誰かが使用できるように私の答えを文書化したかっただけです。Christian が指摘したように、.NET フレームワークの内部クラスを使用するのは賢明ではありません。でも、本当にやりたいなら、この方法でできます。

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

これにより [キャンセル] ボタンが非表示になりますが、[OK] ボタンがダイアログの中央にぶら下がったままになります。したがって、[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

これを試して

// 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 に答える
0

これは内部クラスです (したがって、名前空間名とそれが存在し、最初にアクセスするためにリフレクションが必要であるという事実internalもあります)。

.NET フレームワークの内部クラスを使用することはあまり賢明ではありません。予告なく変更(または消滅)する場合があります。また、「どのように機能するのか」やドキュメントを求めることは、むしろ無意味です。

@keyboardP が提案したような独自のダイアログを作成することを検討するか、標準の Windows タスク ダイアログ コンポーネント (Windows Vista 以降で利用可能) を調べてください。TaskDialog はネイティブ コンポーネントであり、それを使用するには (最終的に) P/Invoke が必要です。その作業は(複数回)行われましたが、GoogleまたはSOで検索してくださいTaskDialog .NET.

TaskDialog を使用すると、Windows 自体があらゆる場所で使用するため、ユーザーが認識できるという追加の利点があります。

P/Invoke を使用して問題や制限がある場合は、マネージ コードでの再実装のいずれかを選択することもできます。

于 2013-08-27T10:03:42.073 に答える