walidacja danych

0

Witam,
Zaczynam dopiero naukę programowania więc proszę o wyrozumiałość.
Mam w programie kilkanaście textbox'ów do wprowadzania danych do bazy i potrzebuję dokonać weryfikacji wprowadzanych danych. Widziałem że w ASP są odpowiednie kontrolki ale w MV C# 2008 Express nie znalazłem.
Do rzeczy:
Dla wszystkich textbox'ów - nie mogą być puste;
oraz dla poszczególnych:

  • sprawdza czy format daty jest prawidłowy;
  • sprawdza czy format godziny jest prawidłowy;
  • sprawdza czy jest wpisana wyłącznie liczba całkowita;
0
trzcionek napisał(a)

Dla wszystkich textbox'ów - nie mogą być puste;
oraz dla poszczególnych:

  • sprawdza czy format daty jest prawidłowy;
  • sprawdza czy format godziny jest prawidłowy;
  • sprawdza czy jest wpisana wyłącznie liczba całkowita;

To przed wysłaniem danych do bazy sprawdzaj poprawność otrzymanych danych od użytkownika. A jeśli chcesz żeby to było w stylu kontrolek ASP.NET to sprawdzaj poprawność danych po stracie focusa na TextBoxie. A tutaj i tutaj lektura na temat walidacji danych w Windows Forms.

0

Ale jak sprawdzić np. czy to co jest wpisane jest liczbą lub czy wygląda rrrr-mm-dd?
Bo tak to sobie IF'em sprawdzę ;)

PS. Fajny bajer z googlem ;)

rozwiązuję sprawdzanie w ten sposób:

        private void godzinaTB_Validating(object sender, CancelEventArgs e)
        {
            System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex("^([0-9]{2}):([0-9]{2}):([0-9]{2})$");
            System.Text.RegularExpressions.Match matches = reg.Match((sender as TextBox).Text);
            if (matches.Success)
            {
                this.label12.Visible = false;
            }
            else
            {
                this.label12.Visible = true;
                this.label12.Text = "Nieporawny format!";
                //e.Cancel = true;
            }
    
        }

Tylko w jaki sposób zapobiec dodaniu źle wpisanego elementu do bazy, bo nie chcę zablokować możliwości opuszczenia textbox,a

0
trzcionek napisał(a)

Ale jak sprawdzić np. czy to co jest wpisane jest liczbą

Najprościej spróbować sparsować takiego stringa na inta czy inny typ liczbowy i sprawdzić czy nie jest rzucany wyjątek. Masz od tego metody np. Int.TryParse(). Możesz rozważyć też stworzenie TextBoxa, który będzie przyjmować tylko wartości numeryczne.

trzcionek napisał(a)

lub czy wygląda rrrr-mm-dd?

Użyj wyrażeń regularnych albo MaskedTextBox.

0

Jak wcześniej napisałem wyrażenia regularne użyłem ale nie wiem jak w buttonie sprawdzić czy dane wpisane w textboxa'a są prawidłowe. (znaczy czy ktoś nie olał komunikat o błędnym formacie).

0

jak ktos depnie buttona - na ktorym masz sprawdzanie czy wszystko jest okej, np

if (textbox1.text.length==0)
{
MessageBox.Show("wystapil blad, nie podales danych w textboxie nr 1");
return;
}

return spowoduje przerwanie wykonywania dalszej czesci kodu, innymi slowy, koles nie przejdzie dalej jesli nie zostanie spelniony powyzszy warunek...

0

Ale co z tym jeśli są tam wpisane bzdury?
Jeśli jest puste to załatwiłem przez Trim().

0

no to teraz nie czaje, bo najpierw piszesz

(znaczy czy ktoś nie olał komunikat o błędnym formacie)

moje rozwiązanie z return, blokuje program przed przejściem dalej, wiec koleś nie przejdzie choćby nie wiem co, i olanie komunikatu mu nic nie pomoże...

jeśli natomiast chcesz sprawdzić czy koleś nie wpisał bzdur, no to muszę Cie zmartwić, nie ma na to rady... przed pewnymi możliwościami możesz się obronić (np sprawdzić czy NIP jest poprawny, lub adres Email) ale już np Imie czy Nazwisko, to możesz jedynie sprawdzić cz nie zawiera znaków specjalnych (bo cyferki może zawierać)

na ludzką głupotę nie ma rozwiązania, nie znajdziesz cudownego środka na sparsowanie stringa tak jak byś chciał, zawsze znajdzie się ktoś kto coś wymyśli, czego Ty nie przewidziałeś

0

Już nie wiem jak to opisać.
W ten sposób sprawdzam wyświetlam komunikat o błędzie wprowadzanych danych:
Trochę nieudolnie z datą zrobiłem, ale to w tej chwili nie ważne:

        private void dataTB_Validating(object sender, CancelEventArgs e)
        {
            System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex("^([1-2]{1})([0-9]{3})-([0-1]{1})([1-9]{1})-([0-3]{1})([1-9]{1})$");
            System.Text.RegularExpressions.Match matches = reg.Match((sender as TextBox).Text);
            if (matches.Success)
            {
                e.Cancel = false;
                this.errorProviderMain.Clear();              
            }
            else
            {
                this.errorProviderMain.SetError(dataTB, "Nieporawny format!");
                e.Cancel = false;
            }
        }

I teraz najważniejsze jeśli obok textbox'a pojawia się informacja o błędnym formacie. to żeby po kliknięciu przycisku dodaj wyskoczył Mesagebox z informacją że coś jest błędne i nie zostanie wykonania reszta kodu.

Tutaj początek tego co mam w buttonie:

        private void dodaj_Click(object sender, EventArgs e)
        {
            if (this.oddzialTB.Text.Trim() != "" && this.strefaTB.Text.Trim() != "" && this.ludzieTB.Text.Trim() != "" && this.dataTB.Text.Trim() != "" && this.godzinaTB.Text.Trim() != "" && this.nazwiskoTB.Text.Trim() != "" && this.telefonTB.Text.Trim() != "")
            {
(...)
}
}
0

robisz to troche od dup... strony.... nie wiem po co sprawdzac za kazdym razem czy koles nie popelnil gafy.. nie lepiej dac mu w spokoju wypelnic wszystkie pola a na koniec przy sprawdzaniu krzyknac ze cos ma zle i przerwac dzialanie guzika ok?

ale jak juz sie uparles na to swoje sprawdzanie - to dodaj sobie tablice bool w ilosci tyle ile masz tych swoich text boxow, i przy sprawdzaniu poprawnosci formatu ustawiaj sobie np
dla textboxa1 is_ok[0]=true dla textboxa2 is_ok[1]=true... i tak dalej

a na koncu, w tej twojej metodzie dodaj_click zrob

if (is_ok[0] && is_ok[1] && is_ok[....]) 
{
//wtedy odpal ten kod
}
0

to że od "niewłaściwej" strony to zauważyłem, ale brak mi umiejętności - dopiero zaczynam.
W jaki sposób widziałbyś rozwiązanie czegoś takiego
mając textboxy:
imię nazwisko liczba data godzina telefon
Button_Dodaj;
I po kliknięciu Dodaj sprawdzi czy wszystkie nie są puste oraz czy "liczba" jest liczbą, "data" w formacie rrrr-mm-dd oraz "godzina" w formacie hhss.

Z góry dzięki za pomoc.

0

Tak się wtrącę:
Właśnie tak możesz to zrobić...
Poniżej kawałek przykładowego kodu:

private void buttonOk_Click(object sender, EventArgs e)
{
            bool _ok = true;

            if (textBoxName.Text == "")
            {
                textBoxName.BackColor = Color.Red;
                _ok = false;
            }

            if (tutajSprawdzenieFormatuZaPomocaRegex)   // nie pisałem swojego wyrażenia, ale wiesz co trzeba tutaj wstawić ;)
            {
                textBoxBirthDate.BackColor = Color.Red;
                _ok = false;
            }
            if (!_ok)
            {
                MessageBox.Show("Popraw wprowadzone dane");
                return;
             }
}

Sprawdzasz sobie kolejne textBox'y, jeśli coś jest nie tak, zmieniasz jego kolor na inny (tutaj czerwony)
żeby user od razu wiedział gdzie co ma poprawić a zmienna _ok określa czy wszystko ok i puszczać program dalej czy nie.

0

Rozwiązanie jakie zasugerował coorter chyba będzie najlepsze, jednak moje logiczne myślenie wysiadło.
Trzeba popracować nad solidnymi podstawami.
Problem uważam za rozwiązany, dziękuję wszystkim za zainteresowanie.

0

Ja zaproponuję inny sposób walidacji danych. Za pomocą DataTable :)
Skoro mamy wrzucać dane do bazy danych, czyli do jakiegoś DataTable, to czemu nie wykorzystac dataTable do sprawdzenia poprawności wpisów...
Załóżmy, że mam na formatce trzy textBoxy (textBox1, textBox2, textBox3) z których każdy trzyma inne dane - String, Double, DateTime.
Tworzę więc sobie tabelę, która ma takie trzy pola:

            DataTable dt = new DataTable();

            dt.Columns.Clear();
            dt.Columns.Add("Nazwa", Type.GetType("System.String"));
            dt.Columns.Add("Data", Type.GetType("System.DateTime"));
            dt.Columns.Add("Liczba", Type.GetType("System.Double"));
            dt.Rows.Add(dt.NewRow());

W ostatniej linijce jest dodanie nowego rekordu, gdyż inaczej ten sposób nie zadziała.
I teraz 'wiążę' textboxy z odpowiednimi kolumnami tabeli:

            textBox1.DataBindings.Add(new Binding("Text", dt, "Nazwa", true));
            // powiązanie formatu tabeli z polem textowym - ostatni parametr odpowiada za format.
            textBox2.DataBindings.Add(new Binding("Text", dt, "Liczba", true));
            textBox3.DataBindings.Add(new Binding("Text", dt, "Data", true));

I to juz właściwie koniec.
Program nie pozwala wyjść z pola, dopóki format mu się nie zgadza... :)
Dodatkowo NIE JEST WAŻNE jak wpiszesz datę - czy z ., czy z /, czy też napiszesz "7 lipiec 2009" - i tak po opuszczeniu pola będziesz miał tam datę zgodną z ustawieniami regionalnymi...

Wydaje mi się, że jest to najlepszy sposób dla początkujących.

pozdrawiaMM

1 użytkowników online, w tym zalogowanych: 0, gości: 1