簡體   English   中英

C#CancelButton關閉對話框?

[英]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鍵關閉窗口而不提交更改,而不是用鼠標手動單擊取消按鈕。

CancelButton Property

而不是嘗試在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM