WinForm的技巧(1 of n)視窗關閉的提示

來源:互聯網
上載者:User

我將通過本文向大家介紹添加"視窗關閉的提示"的恰當做法。

在程式運行時,可以通過點擊右上方的紅叉,關閉一個表單;也可以通過調用表單的Close()方法關閉表單。如果想在表單關閉前向使用者提供一個提示框,防止重要訊息未被儲存就關閉,大家會怎麼做呢?很多人會想到在調用Close前加入資訊框代碼。但這個做法是不完美的,因為Close方法是被調用的,你不知道Close在會何處調用,而且你不可能到處都寫資訊框語句。正確的做法卻不是調用Close之前,而是調用Close"之後"

正確的做法是處理Form的FormClosing事件:

public delegate void FormClosingEventHandler(object sender, FormClosingEventArgs e);
public event FormClosingEventHandler FormClosing;

Form執行個體被調用Close()方法後,不是馬上銷毀表單而是建立FormClosingEventArgs執行個體e,作為參數發出FormClosing,在事件被處理完後,再檢查e.Cancel是否等於true,如果是true視窗撤銷銷毀,如果為false繼續銷毀Form。因此我們可以通過處理FormClosing事件,在處理當中對e.Cancel進行賦值,就可達到表單撤銷關閉,所以為什麼前面強調"之後"。例如,前面說到的可以這樣實現代碼:

 


this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);

 

void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (MessageBox.Show(
            "視窗關閉後,資料即將丟失!是否現在關閉視窗",
            "提示", 
            MessageBoxButtons.OKCancel, 
            MessageBoxIcon.Question) != DialogResult.OK)
            {
                e.Cancel = true;
            }
}

但要注意,這種處理常式一般來說只有e.Cancel = true;的代碼,沒有e.Cancel = false;的代碼。因為事件是屬於一種委託,委託是多播的。所以,有可能有多個事件處理程式碼片段,如果賦值將會影響整個委託的參數。這裡的需求是,一旦其中一個處理的程式碼片段e.Cancel=true,表單都不應該被關閉,所以應盡量避免e.Cancel=false 的指派陳述式影響其它的事件處理結果。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.