Szukaj…


Wprowadzenie

W tym temacie wyjaśniono, jak działa silnik WinForms do wyświetlania formularzy i jak kontroluje się ich czas życia.

Pokaż modelkę lub formę modalną

Po zdefiniowaniu struktury formularza za pomocą projektanta WinForms możesz wyświetlać swoje formularze w kodzie za pomocą dwóch różnych metod.

  • Metoda - Formularz modelki

     Form1 aForm1Instance = new Form1(); 
     aForm1Instance.Show();
    
  • Metoda - modalne okno dialogowe

     Form2 aForm2Instance = new Form2(); 
     aForm2Instance.ShowDialog();
    

Te dwie metody mają bardzo ważne rozróżnienie. Pierwsza metoda (modelowa) pokazuje formularz, a następnie natychmiast wraca, nie czekając na zamknięcie właśnie otwartego formularza. Więc twój kod kontynuuje wszystko, co następuje po wywołaniu Show. Zamiast tego druga metoda (modalna) otwiera formularz i blokuje wszelkie działania w całej aplikacji, dopóki nie zamkniesz formularza za pomocą przycisku zamykania lub za pomocą niektórych przycisków odpowiednio skonfigurowanych do zamknięcia formularza

Zamknięcie formularza modelki

Formularz bez modelki jest stosowany (zwykle), gdy trzeba stale wyświetlać coś obok głównego ekranu aplikacji (pomyśl o legendzie lub widoku strumienia danych przychodzących asynchronicznie z urządzenia lub okna potomnego MDI).
Ale modelka stanowi wyjątkowe wyzwanie, gdy chcesz ją zamknąć. Jak pobrać instancję i wywołać metodę Close w tej instancji?

Możesz zachować zmienną globalną odwołującą się do instancji, którą chcesz zamknąć.

theGlobalInstance.Close();
theGlobalInstance.Dispose();
theGlobalInstance = null;

Możemy jednak również użyć kolekcji Application.OpenForms, w której silnik formularzy przechowuje wszystkie utworzone i otwarte instancje formularzy.

Możesz pobrać tę konkretną instancję z tej kolekcji i wywołać metodę Close

Form2 toClose = Application.OpenForms.OfType<Form2>().FirstOrDefault();
if(toClose != null)
{
    toClose.Close();
    toClose.Dispose();
}

Zamknięcie formy modalnej

Gdy formularz jest wyświetlany za pomocą ShowDialog , konieczne jest ustawienie właściwości DialogResult formularza, aby była zamknięta w formularzu. Tę właściwość można ustawić za pomocą wyliczenia zwanego również DialogResult .

Aby zamknąć formularz, wystarczy ustawić właściwość DialogResult formularza (na dowolną wartość DialogResult.None ) w pewnej procedurze obsługi zdarzeń. Po wyjściu kodu z modułu obsługi zdarzeń silnik WinForm ukryje formularz, a kod następujący po początkowym wywołaniu metody ShowDialog będzie kontynuował wykonywanie.

private cmdClose_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.Cancel;
}

Kod wywołujący może przechwycić wartość zwracaną z ShowDialog, aby ustalić, który przycisk kliknął użytkownik w formularzu. Podczas wyświetlania za pomocą ShowDialog() formularz nie jest usuwany automatycznie (ponieważ został po prostu ukryty i nie zamknięty), dlatego ważne jest, aby użyć bloku using , aby upewnić się, że formularz został usunięty.

Poniżej znajduje się przykład sprawdzania wyniku użycia wbudowanego OpenFileDialog , sprawdzania wyniku i uzyskiwania dostępu do właściwości z okna dialogowego przed usunięciem.

using (var form = new OpenFileDialog())
{
    DialogResult result = form.ShowDialog();
    if (result == DialogResult.OK)
    {
        MessageBox.Show("Selected file is: " + form.FileName);
    }
}

Można również ustawić właściwość DialogResult na przycisku. Kliknięcie tego przycisku spowoduje ustawienie właściwości DialogResult w formularzu na wartość powiązaną z przyciskiem. Umożliwia to zamknięcie formularza bez dodawania procedury obsługi zdarzeń w celu ustawienia DialogResult w kodzie.

Na przykład, jeśli dodasz przycisk OK do formularza i DialogResult.OK jego właściwość na DialogResult.OK wówczas formularz zostanie zamknięty automatycznie po naciśnięciu tego przycisku, a kod wywołujący otrzyma DialogResult.OK w zamian za wywołanie metody DialogResult.OK ShowDialog() .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow