Zamknięcie formatki krzyżykiem

Zamknięcie formatki krzyżykiem
HI
  • Rejestracja: dni
  • Ostatnio: dni
0

Witam,

Mam następujący problem:

Kopiuj
private void Button1_Click(object sender, EventArgs e)
{
    this.Close();
}

private void Button2_Click(object sender, EventArgs e)
{
    this.Close();
}

private void FormStart_FormClosing(object sender, FormClosingEventArgs e)
{
    if (sender is Button)                     // to oczywiście nie działa bo obiektem wywołujacym jest formatka
        this.Close();
    else
        Application.Exit();
}

Jak widać powyżej, chciałbym zamknąć okno jeśli ktoś kliknął na button, albo zamknąć całą aplikację, jeśli ktoś kliknął na krzyżyk formatki. Wiecie może jak rozwiązać ten problem?

Bardzo dzięuję za wszelkie odpowiedzi.
Pozdrawiam, Hiob.

xeo545x39
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kosmos
  • Postów: 1571
0

Jeżeli to forma główna, to aplikacja zamknie się pod wpływem zamknięcia głównej formy. Jeżeli chcesz tylko i wyłącznie zamykać poprzez Button, a nie krzyżyk, wystarczy sprawdzić czy sender jest właśnie Buttonem i zmienić właściwość Cancel FormClosingEventArgs na true.

HI
  • Rejestracja: dni
  • Ostatnio: dni
0

... a jak sprawdzić, czy "Close()" wywołał "Button" czy krzyżyk?

xeo545x39
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kosmos
  • Postów: 1571
1

Tak tego nie zrobisz. Utwórz dodatkową zmienną, którą ustawisz w przypadku zamknięcia z Buttona, a potem w evencie closing sprawdź czy button zamknął. Event closing jest wywoływany i tak przez formatkę, więc sender będzie formatką.

HI
  • Rejestracja: dni
  • Ostatnio: dni
0

Zrobiłem to tak:

Kopiuj
private Boolean CloseApplication = true;

private void Button1_Click(object sender, EventArgs e)
{
    this.CloseApplication = false;
    this.Close();
}
 
private void Button2_Click(object sender, EventArgs e)
{
    this.CloseApplication = false;
    this.Close();
}
 
private void FormStart_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this.CloseApplication)
        Application.Exit();
    else
        this.Close();
}

... ale wyskakuje mi błąd:

Kopiuj
Cross-thread operation not valid: Control 'ButtonRS485' accessed from a thread other than the thread it was created on.

Edit.

Dobra widzę błąd :)

Kopiuj
private Boolean CloseApplication = true;

private void Button1_Click(object sender, EventArgs e)
{
    this.CloseApplication = false;
    this.Close();
}
 
private void Button2_Click(object sender, EventArgs e)
{
    this.CloseApplication = false;
    this.Close();
}
 
private void FormStart_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this.CloseApplication)
        Application.Exit();
}

Dziękuję za pomoc!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.