2013-01-17 158 views
6

好的,所以Windows窗體類,WindowSettings和窗體具有「取消」按鈕。當用戶點擊該按鈕時,彈出對話框DialogSettingsCancel,並詢問用戶他是否確定他想要執行該操作。該對話框有2個按鈕,一個是「是」按鈕和一個是「否」按鈕。如果用戶點擊「是」按鈕,我希望關閉DialogSettingsCancel和WindowSettings。如何關閉C#中的窗體#

我button_Click事件處理程序DialogSettingsCancel:

private void button1_Click(object sender, EventArgs e) 
{ 
    //Code to trigger when the "Yes"-button is pressed. 
    WindowSettings settings = new WindowSettings(); 
    this.Close(); 
    settings.Close(); 
} 

當我運行我的應用程序,並進入設置窗體,然後單擊「取消」按鈕上,然後單擊「是」按鈕上,只有DialogSettingsCancel關閉而不關閉WindowSettings。

爲什麼它不工作?

我也試着改變

this.Close(); 
settings.Close(); 

​​

但還是同樣的結果。

+1

您的「設置」從未顯示爲首先關閉,您可能正在尋找其他實例 –

+0

發生這種情況是因爲您在關閉另一個「窗口」之前關閉了正在處理單擊事件的「窗口」 '。這不是Form類,這是一個'Window'類的巨大差異。此外,設置不等於WindowSettings的實例,它等於一些完全不同的實例。使用VS調試器。 –

回答

6

您需要開放的WindowSettings的實際實例,而不是新實例。

當前,您正在創建一個新實例WindowSettings並且在此處調用Close。這並沒有做任何事情,因爲這個新實例從未被顯示過。

相反,當顯示DialogSettingsCancel時,將WindowSettings的當前實例設置爲父項。

事情是這樣的:

WindowSettings

private void showDialogSettings_Click(object sender, EventArgs e) 
{ 
    var dialogSettingsCancel = new DialogSettingsCancel(); 
    dialogSettingsCancel.OwningWindowSettings = this; 
    dialogSettingsCancel.Show(); 
} 

DialogSettingsCancel

public WindowSettings OwningWindowSettings { get; set; } 

private void button1_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
    if(OwningWindowSettings != null) 
     OwningWindowSettings.Close(); 
} 

這種方法考慮到,一個DialogSettingsCancel可能被打開沒有WindowsSettings如父。

如果兩者始終處於連接狀態,你應該使用一個構造函數的參數:

WindowSettings

private void showDialogSettings_Click(object sender, EventArgs e) 
{ 
    var dialogSettingsCancel = new DialogSettingsCancel(this); 
    dialogSettingsCancel.Show(); 
} 

DialogSettingsCancel

WindowSettings _owningWindowSettings; 

public DialogSettingsCancel(WindowSettings owningWindowSettings) 
{ 
    if(owningWindowSettings == null) 
     throw new ArgumentNullException("owningWindowSettings"); 

    _owningWindowSettings = owningWindowSettings; 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
    _owningWindowSettings.Close(); 
} 
+0

非常感謝你:) – Spookbuster

5
new WindowSettings(); 

您剛剛關閉了首先不可見的全新窗體實例。

您需要關閉原始表單實例,方法是將其作爲構造函數參數接受並將其存儲在字段中。

2

你關閉你的設置實例窗口創建後立即。您需要先顯示設置窗口,然後等待對話結果。如果取消,則關閉窗口。例如:

private void button1_Click(object sender, EventArgs e) 
{ 
    Settings newSettingsWindow = new Settings(); 

    if (newSettingsWindow.ShowDialog() == DialogResult.Cancel) 
    { 
     newSettingsWindow.Close(); 
    } 
} 
0

發送WindowSettingsDialogSettingsCancel的構造函數的參數,然後在的button1_Click時是按呼叫兩者的close方法。

public class DialogSettingsCancel 
{ 
    WindowSettings parent; 

    public DialogSettingsCancel(WindowSettings settings) 
    { 
     this.parent = settings;   
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     //Code to trigger when the "Yes"-button is pressed. 
     this.parent.Close(); 
     this.Close(); 
    } 
} 
2

爲什麼不使用DialogResult方法關閉窗體?

if(DialogSettingsCancel.ShowDialog() == DialogResult.Yes) 
{ 
    this.close(); 
} 

爲此工作,但您需要在您的「WindowSettings」窗體內調用DialogSettingsCancel窗體時執行此操作。與您稱爲OpenFileDialog或其他任何Dialog表單的方式大致相同。

1

您也可以關閉應用程序:

Application.Exit();

這將結束進程。