2013-08-27 119 views
1

我想顯示一個消息框與OkDetail按鈕在form.I已完成此功能的一些代碼,但它也顯示取消按鈕和詳細信息部分它只顯示那個我用字符串寫的信息。代碼是如何顯示消息框的詳細信息和確定選項

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

是否有使用反射一些特別的原因嗎? –

+0

@lazyberezovsky沒有其他選擇:相應的類是「internal」,否則無法訪問。 –

回答

3

如果我理解正確,您要將MessageBox上的默認OKCancel按鈕更改爲OKDetails。這需要太多的工作,而且不需要創建自己的MessageBox就可以輕鬆完成。

IMO你最好創建一個看起來像MessageBox的新窗體,並顯示每次需要顯示消息。在顯示您的​​時,您可以使用ShowDialog,這樣它就是一個類似於MessageBox的模式窗口。

0

這是一個內部類(因此命名空間的名稱和事實是它是internal,你甚至需要反射才能訪問它)。

使用.NET框架的內部類不是很明智。他們可能會改變(或消失),恕不另行通知。另外,要求「它是如何工作的」甚至是文檔都是毫無意義的。

考慮建立像@keyboardP建議的自己的對話框,或者查看標準的Windows任務對話框組件(Windows Vista以後可用)。 TaskDialog是一個本地組件,你(最終)需要P/Invoke來使用它。但是,該工作已完成(多次),只需在Google或SO上搜索TaskDialog .NET即可。

使用TaskDialog還有一個額外的好處,就是它可以被用戶識別,因爲Windows本身在整個地方使用它。

如果您有使用P/Invoke的問題/限制,您還可以選擇managed code中的一個重新實現。

0

我知道這是一箇舊的線程,你可能已經找到了答案。但只是想記錄我的答案供任何人使用。正如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對象。

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();