2009-11-20 120 views
4

(VS2005,.Net 2.0)C#CancelButton關閉對話框?

我有一個使用ShowDialog()方法顯示爲對話框的窗體。該窗體的CancelButton屬性設置爲窗體上的一個按鈕。即使我將該按鈕的DialogResult設置爲None,單擊該按鈕仍會關閉該對話框。我不希望發生這種情況 - 我希望能夠控制對話框是否關閉。

此問題不會發生與窗體的AcceptButton - 與該按鈕的DialogResult設置爲無,我可以做什麼處理是必要的,然後決定是否手動設置窗體的DialogResult導致它關閉。

我以爲CancelButton屬性意思是soley,表示按下Escape鍵時應該「點擊」的按鈕(很像AcceptButton只是表示按下Enter時按下「click」按鈕)。我錯了嗎?我錯過了我的表單正在關閉的其他原因嗎?或者這是一個錯誤?

編輯:添加代碼。這是帶取消按鈕(按鈕1)的對話窗體(窗體2)。 取消按鈕只是形式的CancelButton,它不具備的DialogResult設置爲取消,但按下按鈕仍然關閉窗體

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); 
    } 
+1

我認爲你需要發表一些代碼 – ChrisF 2009-11-20 11:44:16

回答

7

還要注意,按Alt + F4並按下X按鈕可以關閉窗體,兩種方式都不會觸發取消按鈕單擊事件。

除非您也在處理這些情況,否則最好遵循slurdge的建議並防止窗體在FormClosing事件中關閉。

編輯: 另請注意,如果您在屬性窗口中將按鈕的DialogResult更改回無,您將更改爲默認值。如果該值是該屬性的默認值,那麼它將不會保留在* .Designer.cs中。即使它被持久化了,表單初始化代碼也會放在* .Designer中。CS和將覆蓋與無取消,因爲該行的:

this.CancelButton = this.button1; 

正如你可以在反射鏡檢查前行做到這一點:

public void set_CancelButton(IButtonControl value) 
{ 
    base.Properties.SetObject(PropCancelButton, value); 
    if ((value != null) && (value.DialogResult == DialogResult.None)) 
    { 
     value.DialogResult = DialogResult.Cancel; 
    } 
} 

您可以在構造後改回爲無InitializeComponent()調用。

+0

嗯。我隱藏了X按鈕,但沒有意識到Alt-F4會關閉對話框。事實上,slurdge的實際解決方案似乎是最好的,但我仍然好奇爲什麼/當按鈕的DialogResult被設置爲Cancel時,我在設計器中將其更改爲None。 – Rawling 2009-11-20 12:15:29

+0

請參閱我的答案的編輯。 – 2009-11-20 12:25:16

+0

我認爲你的編輯最接近於解釋發生了什麼,在運行時設置CancelButton屬性也設置按鈕的DialogResult。 我仍然處於黑暗中,爲什麼會發生這種情況,但沒有向Microsoft發問,我不確定我會得到答案。 – Rawling 2009-11-20 12:33:18

2

這是默認的行爲。

從MSDN:

此屬性允許您指定當用戶按下應用程序中的ESC鍵進行默認操作。您可以使用此屬性來允許用戶快速導航一個簡單的表單,只需按下ESC鍵即可關閉一個窗口而無需進行更改,而無需用鼠標手動點擊取消按鈕。

CancelButton Property

+0

我讀到「當按下Esc時按下此按鈕 - 按下按鈕可能涉及關閉窗體」,而不是「按下Esc時按下此按鈕,我們使按鈕按下自己關閉窗體「。 – Rawling 2009-11-20 11:52:25

+1

您是否檢查過URL,它還包含社區內容[我沒有注意到;]] 將按鈕設置爲Visual Studio設計器中的CancelButton也具有將按鈕的DialogResult設置爲取消。對於模式對話框,這會自動導致窗體在點擊按鈕時關閉。要阻止窗體關閉,請清除DialogResult屬性或在您的點擊處理程序中使用此代碼: this.DialogResult = DialogResult.None; – Anuraj 2009-11-20 12:03:55

+0

嗯。 我注意到在設計器中設置CancelButton也會將按鈕的DialogResult設置爲Cancel。 但是,即使您將設計器中的按鈕的DialogResult更改爲無,仍然會關閉該窗口。實際上,在調試時,我注意到 - 即使在Designer中將按鈕的DialogResult設置爲none,按鈕的DialogResult仍然是Cancel。這裏發生了什麼? – Rawling 2009-11-20 12:10:49

5

看來,要執行的形式關閉驗證。
FormClosing事件對此非常合適。這將使您能夠擁有相同的代碼來控制關閉與否。
只需將取消屬性設置爲true以防止關閉。 見FormClosing

+1

這很方便,也許我最終會做。 但是,我真正關心的是,爲什麼按鈕導致表單首先關閉,當我沒有告訴它。 – Rawling 2009-11-20 12:04:36

+0

+1這就是我所做的。 – Hath 2009-11-20 12:22:56

1

不是試圖在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 
    } 
} 

我在這裏處理我接受按鈕的代碼還,我假設任何事情!= DialogResult.OK是取消,但你可以做什麼是舒適的爲您服務。