[英]C# CancelButton closes dialog?
(VS2005,.Net 2.0)
我有一個使用ShowDialog()方法顯示為對話框的表單。 表單的CancelButton屬性設置為窗體上的按鈕。 即使我將該按鈕的DialogResult設置為None,單擊該按鈕仍會關閉對話框。 我不希望這種情況發生 - 我希望能夠控制對話框是否關閉。
表單的AcceptButton不會出現此問題 - 將該按鈕的DialogResult設置為none,我可以進行必要的處理,然后決定是否手動設置表單的DialogResult以使其關閉。
我認為如果按下Escape,則CancelButton屬性意味着指示應該“點擊”的按鈕(就像在按下Enter時,AcceptButton只應指示按鈕“點擊”)。 我錯了嗎? 我錯過了我的表格結束的其他原因嗎? 或者這是一個錯誤?
編輯:添加了代碼。 這是帶有取消按鈕(按鈕1)的對話框表單(表單2)。 取消按鈕只是表單的CancelButton,它沒有將DialogResult設置為Cancel,但按下按鈕仍然關閉表單
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Name = "button1";
this.button1.Text = "button1";
//
// Form2
//
this.CancelButton = this.button1;
this.Controls.Add( this.button1 );
this.Name = "Form2";
this.Text = "Form2";
this.ResumeLayout( false );
}
還要注意,可以通過按Alt + F4並按下X按鈕關閉表單,兩種方式都不會觸發取消按鈕單擊事件。
除非您也處理這些情況,否則最好不要遵循slurdge的建議並阻止表單在FormClosing事件中關閉。
編輯:另請注意,如果在“屬性”窗口中將按鈕的DialogResult更改回“無”,則會將其更改為默認值。 如果該值是屬性的默認值,則它將不會保留在* .Designer.cs中。 即使它被持久化,表單初始化代碼也會放在* .Designer.cs的最后一位,並且因為這行而將覆蓋None取消:
this.CancelButton = this.button1;
正如您可以在Reflector中檢查前一行執行此操作:
public void set_CancelButton(IButtonControl value)
{
base.Properties.SetObject(PropCancelButton, value);
if ((value != null) && (value.DialogResult == DialogResult.None))
{
value.DialogResult = DialogResult.Cancel;
}
}
在InitializeComponent()調用之后,您可以在構造函數中將其更改回None。
您似乎想要執行表單關閉的驗證。
FormClosing事件非常適合這種情況。 這將使您能夠使用相同的代碼來控制關閉與否。
只需將Cancel屬性設置為true即可阻止關閉。 請參見FormClosing 。
這是默認行為。
來自MSDN:
此屬性允許您指定當用戶在應用程序中按ESC鍵時發生的默認操作。 您可以使用此屬性允許用戶快速導航簡單表單,方法是只需按ESC鍵關閉窗口而不提交更改,而不是用鼠標手動單擊取消按鈕。
而不是嘗試在button_click事件中處理它,而是在form_closing事件中處理它。
MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (DialogResult == DialogResult.Cancel)
{
// do my processing ...
if (false)
e.Cancel = true; // stop the form from closing
}
}
我也在這里處理我的Accept按鈕代碼,我假設一切!= DialogResult.OK是一個取消,但你可以做任何適合你的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.