2013-01-17 18 views
6

Ok, więc klasa Windows Forms, WindowSettings i formularz ma przycisk "Anuluj". Kiedy użytkownik kliknie przycisk, okno dialogowe DialogSettingsCancel wyskoczy i zapyta użytkownika, czy jest przekonany, że chce wykonać akcję. Okno dialogowe ma 2 przyciski, przycisk "Tak" i przycisk "Nie". Jeśli użytkownik kliknie przycisk "Tak", chcę, aby zarówno DialogSettingsCancel, jak i WindowSettings zostały zamknięte.Jak zamknąć formularz w języku C#

My button_Click obsługi zdarzeń w 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(); 
} 

Kiedy uruchamiam moją aplikację i przejść do formularza Ustawienia, a następnie kliknij "Anuluj" -button, a następnie kliknij przycisk "Tak" -button, tylko DialogSettingsCancel zamyka się bez zamykania WindowSettings.

Dlaczego to nie działa?

Próbowałem zostały również zmianę

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

do

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

ale wciąż ten sam rezultat.

+1

twoje "ustawienia" nigdy nie są pokazywane jako zamknięte, prawdopodobnie szukasz innej instancji –

+0

Dzieje się tak, ponieważ zamykasz 'Okno', które obsługuje zdarzenie click przed zamknięciem innego' okna '. To nie jest klasa Form, jest to ogromna różnica klasy "Okno". Ponadto, ustawienia nie są równe instancji WindowSettings, ale są równe zupełnie innej instancji. Użyj debugera VS. –

Odpowiedz

6

Potrzebujesz rzeczywistego wystąpienia WindowSettings, które jest otwarte, a nie nowe.

Obecnie tworzysz nowe wystąpienie WindowSettings i wywołujesz na tym Close. To nic nie robi, ponieważ ta nowa instancja nigdy nie została pokazana.

Zamiast tego po wyświetleniu DialogSettingsCancel ustaw bieżącą instancję WindowSettings jako obiekt nadrzędny.

coś takiego:

W WindowSettings:

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

W DialogSettingsCancel:

public WindowSettings OwningWindowSettings { get; set; } 

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

Takie podejście bierze pod uwagę, że DialogSettingsCancel mogłyby zostać otwarte bez WindowsSettings jako rodzica .

Jeżeli dwa są zawsze podłączony, należy zamiast użyć parametru konstruktora:

W WindowSettings:

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

W 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

Dziękuję bardzo :) – Spookbuster

5
new WindowSettings(); 

Właśnie zamknąłeś zupełnie nową instancję formularza, która nie była widoczna na pierwszym miejscu.

Należy zamknąć instancję oryginalnej instancji, akceptując ją jako parametr konstruktora i przechowując ją w polu.

2

Twój zamykania instancji ustawień okno zaraz po utworzeniu.Najpierw musisz wyświetlić okno ustawień, a następnie poczekać na wynik w oknie dialogowym. Jeśli wróci jako anulowana, zamknij okno. Na przykład:

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

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

wysłać WindowSettings jako parametr konstruktora DialogSettingsCancel a następnie na button1_Click gdy jest wciśnięty tak nazwać ścisły sposób oboje.

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

Dlaczego nie użyć metody DialogResult, aby zamknąć formularz?

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

Aby to działało jednak trzeba to zrobić wewnątrz „WindowSettings” formy podczas zadzwonić formularz DialogSettingsCancel. W podobny sposób można nazwać OpenFileDialog lub dowolnym innym formularzem dialogowym.

1

Można również zamknąć aplikację:

Application.Exit();

To zakończy procesy.