Zabezpieczenia edycyjne
Przez zabezpieczenia edycyjne rozumiemy zabezpieczenie działania aplikacji przed wywołaniem na przykład błędnej konwersji danych. Sytuacja taka może mieć miejsce wtedy gdy łańcuch znaków "abc" będziemy zamieniać na liczbę (typ całkowity).
Jednym z rozwiązań jest zablokowanie wybranych klawiszy edycyjnych w zdarzeniu KeyPress
Cel: Napisz aplikacje, która kontrolkom TextBox zablokuje klawisze alfabetyczne oraz ewentualny pusty łańcuch znaków zamieni na wartość zero po zwolnieniu klawisza.
Krok 1. Układ komponentów
- Label- sztuk 3
- TextBox- sztuk 2
- Button- sztuk 5
Krok 2. Zdarzenie KeyUp i blokowanie pustego łańcucha
Oba komponenty TextBox ustawiamy w stan aktywności edycyjnej
Sprawdzenie pustego ciągu znaków wykonamy poprzez zmierzenie jego długości. Jeżeli będzie mniejsza od 1 (jeden) to wstawimy w łańcuch znak 0 (zero). Dla obu kontrolek TextBox będziemy chcieli zrobić to w jednej funkcji zdarzenia KeyUp
Wskazówka:
private void TextBox1_KeyUp(object sender, KeyEventArgs e)
{
if (textBox1.Text.Length < 1) { textBox1.Text = "0"; }
if (textBox2.Text.Length < 1) { textBox2.Text = "0"; }
}
Skompiluj projekt i sprawdź efekt działania.
Krok 3. Rzutowanie obiektów
Wadą wcześniejszego rozwiązania jest jego długość, zaleta to jasność kodu. Możemy napisać bardziej eleganckie rozwiązanie wykorzystujące rzutowanie obiektu wysyłającego komunikat.
Dla czytelności rozwiązania zadeklarujemy zmienna lokalną typu TextBox
Wskazówka:
private void TextBox1_KeyUp(object sender, KeyEventArgs e)
{
TextBox tb= sender as TextBox;
if (tb.Text.Length < 1) { tb.Text = "0"; }
}
To samo rozwiązanie beż użycia zmiennej lokalnej przyjmuje postać
Wskazówka:
if ((sender as TextBox).Text.Length < 1) { (sender as TextBox).Text = "0"; }
Krok 4. Blokowanie klawiszy alfabetycznych
Zdarzenie KeyPress dla obu komponentów TextBox ustalamy na wspólne i wprowadzamy poniższy kod wykorzystujący kod znaku
Wskazówka:
private void TextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
//ignoruj BackSpace lub znak "minus"
if (e.KeyChar == 8 || e.KeyChar == '-') return;
if (e.KeyChar < '0' || e.KeyChar > '9') e.Handled = true;
}
Skompiluj program i sprawdź efekt działania. Poprawnie działająca aplikacja nie pozwoli wprowadzić innych znaków niż cyfry oraz znak "minus"
Innym rozwiązaniem jest sprawdzenie przynależności wciśniętego znaku do wybranego zbioru znaków struktury
struct System.Char
Praktyczna realizacja blokowania znaków alfabetycznych może być zapisana jak poniżej
Wskazówka:
private void TextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (!Char.IsDigit(e.KeyChar)) e.Handled = true;//tylko cyfry
if (!Char.IsLetter(e.KeyChar)) e.Handled = true;//tylko litery
}
Krok 5. Zabezpieczenie konwersji danych
Zabezpieczenie konwersji wprowadzonych danych zrealizujemy w zdarzeniu Click klawiszy działań. Jednocześnie zadeklarujemy trzy zmienne lokalne typu rzeczywistego. Fragment kodu poniżej
Wskazówka:
private void Button1_Click(object sender, EventArgs e)
{
float a=0, b=0, wynik=0;
if (textBox1.Text.Length > 0) { a = (float)Convert.ToDouble(textBox1.Text);}
if (textBox2.Text.Length > 0) { b = (float)Convert.ToDouble(textBox2.Text);}
//ewentualny kod działań na wartościach a, b, c
}
Ćwiczenie sprawdzające
1. Zrealizuj działanie dodawania, odejmowania, mnożenia i dzielenia z opcją zabezpieczenia konwersji i wykonywanych działań
Pełny kod utworzonej aplikacji
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace wejscieZabezpieczenie
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void TextBox1_KeyUp(object sender, KeyEventArgs e)
{
TextBox tb= sender as TextBox;
if (tb.Text.Length < 1) { tb.Text = "0"; }
}
private void TextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
//ignoruj BackSpace lub znak "minus"
if (e.KeyChar == 8 || e.KeyChar == '-') return;
if (e.KeyChar < '0' || e.KeyChar > '9') e.Handled = true;
//if (!Char.IsDigit(e.KeyChar)) e.Handled = true;//tylko cyfry
//if (!Char.IsLetter(e.KeyChar)) e.Handled = true;//tylko litery
}
private void Button1_Click(object sender, EventArgs e)
{
float a=0, b=0, wynik=0;
if (textBox1.Text.Length > 0) { a = (float)Convert.ToDouble(textBox1.Text);}
if (textBox2.Text.Length > 0) { b = (float)Convert.ToDouble(textBox2.Text);}
Button bt = sender as Button;
//rozpoznaj klawisz po tytule przypisanym do przycisku
switch (bt.Text)
{
case "+":wynik = a + b; break;
case "-": wynik = a - b; break;
case "*": wynik = a * b; break;
case "/": if (b != 0) { wynik = a / b; } break;
case "C":textBox1.Text="0"; textBox2.Text = "0"; break;
}
label3.Text = "Wynik: "+wynik.ToString();
}
}
}