czwartek, 27 grudnia 2012

70-511 Rozdział 8 - Walidacja Windows Forms

Walidacja w WPF została omówiona w poście poświęconym bindowaniu danych. Tym razem przyjrzymy się w jaki sposób można obsłużyć walidację w Windows Forms.

Walidacja na poziomie pojedynczej kontroki
Walidacja pojedynczych pól odbywa się w momencie gdy użytkownik wprowadza dane np. do TextBox-a. Jeżeli chodzi o tę kontrolkę, mamy szereg właściwości ułatwiających ten proces:
  • MaxLength - maksymalna długość tekstu w kontrolce
  • PasswordChar - jaki znak zostanie użyty podczas zasłaniania zawartości kontrolki - przeważnie używane w polach w które wprowadzamy hasło
  • ReadOnly - czy jest tylko do odczytu
  • MultiLine - czy można wprowadzać wiele linii tekstu
Oprócz właściwości, mamy dostępne trzy zdarzenia wywoływane w czasie wprowadzania danych do kontrolek:
  • KeyDow
  • KeyPres
  • KeyUp
KeyDown i KeyUp wywoływane są odpowiednio w momencie naciśnięcia i zwolnienia klawisza. Zdarzenia te są najczęściej wykorzystywane do determinacji czy został wciśnięty jedne z klawiszy: Alt, Shift, Ctrl. Klawiszom tym odpowiadają właściwości logiczne które możemy sprawdzić w metodzie podpiętej pod zdarzenie:

Code:
sender, KeyEventArgs e)
        {
            var alt = e.Alt;
            var ctrl = e.Control;
            var shift = e.Shift;
        }

        private void textBox1_KeyUp(object sender, KeyEventArgs e)
        {
            var alt = e.Alt;
            var ctrl = e.Control;
            var shift = e.Shift;
        }

Za pomocą właściwości KeyCode możemy sprawdzić, który klawisz został naciśnięty:

Code:
            if (e.KeyCode == Keys.A)
            {
                MessageBox.Show("Naciśnięto klawisz");
            }


Zdarzenie KeyPress wywoływane jest, gdy naciśnięty klawisz reprezentuje wartość z tablicy ASCI (są to klawisze liter a - z, liczb, znaków specjalnych. Jeżeli naciśnięte klawisze/klawisz nie tworzą kodu ASCII, zdarzenie nie zostanie wywołane. Przykładem są klawisze Alt, Ctrl. Za pomocą właściwości KeyChar mamy możliwość sprawdzenia jaki klawisz został naciśnięty. Naciśnięty klawisz możemy następnie sprawdzić jawnie (przyrównując go bezpośrednio do żądanego klawisza) bądź skorzystać z metod zawartych w klasie Char:
  • Char.IsDigit(e.KeyChar);
  • Char.IsLetter(e.KeyChar);
  • Char.IsLetterOrDigit(e.KeyChar);
  • Char.IsPunctuation(e.KeyChar);
  • Char.IsLower(e.KeyChar);      
  • Char.IsUpper(e.KeyChar);


Aktywność
Aktywowanie kontrolki, czy też ustawienie fokusa na niej powoduje, że możemy z nią prowadzić interakcje wprowadzając i zmieniając zawartość za pomocą myszki i klawiatury.
Każda kontrolka implementuje metodę Focus, która zwraca wartość logiczną czy udało się ją aktywować. Zdarzenia odpowiedzialne za aktywację kontrolki wywoływane są w następującej kolejności:
  • Enter - wywoływane w momencie gdy kontrolka uzyskała fokus
  • GotFocus - wywoływane w momencie gdy kontrolka po raz pierwszy uzyskała fokus
  • Leave - wywoływane w momencie gdy kontrolka straciła fokus
  • Validating - w momencie walidacji
  • Validated - po zakończeniu walidacji
  • LostFocus - wywoływane w momencie gdy kontrolka po raz pierwszy straciła fokus
Walidację najlepiej przeprowadzić w zdarzeniu Validating. Zdarzenie to jest wywoływane jeżeli zostanie ustawiona flaga CausesValidation kontrolki. Domyślnie ta wartość jest ustawiona, więc nie ma potrzeby tego zmieniać ręcznie. Metoda podpięta pod zdarzenie Validating przyjmuje jako jeden z parametrów obiekt klasy CancelEventArgs. Możemy skorzystać z właściwości Cancel - spowoduje to, iż kontrolka nie straci fokusa w przypadku np. niepowodzenia walidacji.
Przykładowy kod:

Code:
        private void textBox1_Validating(object sender, CancelEventArgs e)
        {
            if (textBox1.Text.Length < 3)
            {
                e.Cancel = true;
            }
        }

Walidację całej formatki można zaimplementować w następujący sposób: klawisz akceptujący wartości czy też przechodzący do następnego kroku przeprowadzi walidację wszystkich pól i w razie niepowodzenia, ustawia fokus na pierwszej kontrolce z nieprawidłową wartością. Przykład:

Code:
        private void button1_Click(object sender, EventArgs e)
        {
            foreach (Control control in Controls)
            {
                if (control is TextBox)
                {
                    if (string.IsNullOrWhiteSpace(control.Text))
                    {
                        control.Focus();
                        return;
                    }
                }
            }
        }

Błędy należy w graficzny sposób przedstawić użytkownikowi. Przydatna do tego jest kontrolka ErrorProvider. Za pomocą metody SetError ustawiamy na danej kontrolce błąd. Aby usunąć powiadomienie o błędzie, należy do metody SetError podać jako błąd pusty ciąg znaków. Przykład:

Code:
            if (textBox1.Text.Length < 3)
            {
                e.Cancel = true;
                errorProvider1.SetError(sender as TextBox, "Błąd walidacji!");
            }
            else
            {
                errorProvider1.SetError(sender as TextBox, "");
            }




Kod do pobrania: http://sdrv.ms/12GZW8A

Brak komentarzy:

Prześlij komentarz