簡體   English   中英

停止關閉父表單

[英]Stop a parent form from closing

我有一個winforms應用程序,我需要一個很好的方法來處理以下問題。

基本上,我有主要的申請表,其中有子表。

用戶可以在父表單上點擊“關閉”。 但是在子窗體中,可能會發生一些事情。 例如,我可能已經編輯了一些數據綁定字段。

我目前在孩子中處於關閉狀態,並正確保存了所有更改。

但是,現在我想選擇取消關閉。 因此,子窗體將提示用戶,並且他們實際上可以取消關閉應用程序的操作。

我在子窗體關閉事件中嘗試了e.Cancel,但這不起作用-我假設是因為父窗體仍在關閉...有沒有辦法從子窗體內取消父窗體的關閉過程... ?

我建議訂閱主要表單中的FormClosing事件,並為每個子表單驗證狀態,並防止表單關閉(如果需要)。 下面的代碼可能會幫助您並給出詳細的思路。

private void Main_FormClosing( object sender, FormClosingEventArgs e ) 
{
    foreach(var f in childforms)
    {
        if(!f.CanClose())
        {
            e.Cancel = true;
            return;
        }
    }

    e.Cancel = false;   
}

這是一個單子窗體的非常簡單的示例。 如果用戶在Form2的文本框中輸入了某些內容,則當他嘗試關閉Form1時將提示他。

public partial class Form1 : Form
{
    Form2 form2;

    public Form1()
    {
        form2 = new Form2();
        form2.Show();
        InitializeComponent();
    }



    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (form2.AskBeforeClosing)
        { 
            e.Cancel = MessageBox.Show("Are you sure?","",MessageBoxButtons.OKCancel)==System.Windows.Forms.DialogResult.Cancel;
        }
    }
}

public partial class Form2 : Form
{
    public bool AskBeforeClosing
    {
        get {
            return textBox1.Text != "";
        }
    }
    public Form2()
    {
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {

    }
}

如果需要使用可變數量的子窗體,則必須執行以下操作:

  1. 定義一個公開bool虛擬只讀屬性AskBeforeClosing的基類形式
  2. 從該基類派生所有子窗體,並使用特定的邏輯來防止意外關閉,從而覆蓋屬性
  3. 將所有子窗體保留在form1的列表中。
  4. 在FormClosing事件處理程序中循環列表,以查找至少一種形式的AskBeforeClosing = true。 如果是這樣,提示用戶

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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