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.

kontrolka TextBox visual studio

Krok 1. Układ komponentów

układ komponentów visual studio

Krok 2. Zdarzenie KeyUp i blokowanie pustego łańcucha

Oba komponenty TextBox ustawiamy w stan aktywności edycyjnej

textBox visual studio

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

visual studio key_press

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"; }
}
textBox visual studio

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"

e.KeyChar visual studio

Innym rozwiązaniem jest sprawdzenie przynależności wciśniętego znaku do wybranego zbioru znaków struktury

struct System.Char
visual studio 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ń

textBox1 visual studio

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();
        }
    }
}
Alkomat- wirtualny test

Alkomat- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Olinowanie stałe- kalkulator średnic

Olinowanie stałe- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
przepis na gogfry

Przepis na gofry

zobacz
przepis na bitą śmietanę

Przepis na bitą śmietanę

zobacz