Walidacja podanego do textBoxa imienia

0

Próbuję uzyskać następujący efekt, ale coś mi nie wychodzi:

pole Imię: (wzór: Adam)

Walidacja ma zakończyć się pozytywnie, gdy:
-pierwsza litera jest wielka,
-liczba znaków jest >= 3
-możliwe jest wpisanie do textBoxa wyłącznie liter (wszystkie inne: cyfry, przecinki, spacje, etc.. są 'niedostępne')

Ogólnie kombinowałem coś z regexp'ami ale nic z tego nie wyszło..

Na razie textBox spełnia dwa pierwsze warunki.. (zamieszczam kod):

 private void firstNameTextBox_TextChanged(object sender, EventArgs e)
        {
            if (firstNameTextBox.Text.Length >= 3 && Char.IsUpper(firstNameTextBox.Text, 0)) 
            {
                 firstNamePictureBox.Image = app.Properties.Resources.ok_icon;
            }
            else
            {
                firstNamePictureBox.Image = app.Properties.Resources.fault_icon;
            }
        }
0

Sprobuj:

textBox.Text.All(Char.IsLetter)
0

@BST - a jak to zastosować (w którym miejscu) ? Bo już zacząłem kombinować, że jeśli chce wpisać cyfrę to ostatecznie ten ostatni znak jest usuwany z końca (wykorzystując do tego m.in. substring..). Jeszcze to do końca nie działa tak jak powinno, ale myślę że przy odpowiednim if'owaniu da się pożądany efekt osiągnąć ... Tylko czy tak to trzeba robic? (nie ma jakieś 'wbudowanej' funkcji pomocnej ?)

0

W tym ifie, dodaj kolejny &&.

0

@mareKO - a nie wolałbyś skorzystać z regexów?

0

@dam1an - szczerze powiedziawszy to tak własnie zrobiłem... ale to nie zadziałało, bo nadal mogłem wpisywać liczby.. A mi chodzi o to aby nie móc w ogóle wpisać ani cyfr ani spacji ani innych znaków oprócz [a-z]

@furious programming - wykorzystałem z regexpów np. do walidacji pola email.. ale nadal nie wiem jak to wykorzystać w wyżej opisanym problemie..

0

Kompletnie nie znam się na wyrażeniach regularnych (nigdy z nich nie korzystałem), ale z szybkiego wychodzi coś w tym stylu:

[A-Z]{1}[a-z]{2,}
Czyli duża litera od A do Z na początku i tylko raz, a następnie małe litery od a do z przynajmniej dwa razy - razem minimum 3 znaki imienia; Ewentualnie dodać ^ dla podkreślenia, że duża litera ma być na początku łańcucha:

^[A-Z]{1}[a-z]{2,}
Jeżeli przykład nie jest dobry, to proszę kogoś obeznanego o porpawienie.

0

-możliwe jest wpisanie do textBoxa wyłącznie liter (wszystkie inne: cyfry, przecinki, spacje, etc.. są 'niedostępne')

Jean-Claude Van Damme będzie niezadowolony...

0
furious programming napisał(a):

Kompletnie nie znam się na wyrażeniach regularnych (nigdy z nich nie korzystałem), ale z szybkiego wychodzi coś w tym stylu:

[A-Z]{1}[a-z]{2,}

domyślnie chodzi o jedno wystąpienie, więc wystarczy:

[A-Z][a-z]{2,}

poza tym nie powiedział że kolejne znaki nie mogą być duże, więc raczej:

[A-Z][A-Za-z]{2,}

no i dochodzi problem polskich znaków, które będzie trzeba po prostu dopisać

0

nie móc w ogóle wpisać ani cyfr ani spacji ani innych znaków oprócz [a-z]

Dodaj coś takiego:

protected override void OnPreviewTextInput(TextCompositionEventArgs e)
        {
            char c = Convert.ToChar(e.Text);
            if (Char.IsLetter(c))
                e.Handled = false;
            else
                e.Handled = true;
            base.OnPreviewTextInput(e);
        } 
0
Azarien napisał(a):

-możliwe jest wpisanie do textBoxa wyłącznie liter (wszystkie inne: cyfry, przecinki, spacje, etc.. są 'niedostępne')

Jean-Claude Van Damme będzie niezadowolony...

mareKO napisał(a):

-liczba znaków jest >= 3

mój kolega z afryki "Mo" też pewnie nie

0

Pewnie chodzi o polskie imiona - jednoczłonowe, bez znaków specjalnych, niekrótsze niż 3 znaki; Może coś w tym stylu:

[[:upper:]][[:lower:]]{2,}

0

A zamiast opieprzać użytkownika za wpisanie imienia z małej litery (z pierwszego postu wynika że jakąś brzydką ikonę dostanie) nie lepiej samemu mu ją poprawić?

0

Panowie/Panie .. widzę aktywną pomoc jednak brakuje mi jednego elementu, aby to wdrożyć...

Jak zaimplementować funkcję (jakie dodać zdarzenie na textBox'a), aby zadziałala ta walidacja (chodzi o nie możliwość wpisania spracji, cyfr etc..)?

Przytaczając przykład emaila z prostym wyrażeniem regularnym:

 
private void emailTextBox_TextChanged(object sender, EventArgs e)
        {
            Regex emailRegex = new Regex(@"[a-z0-9A-z]@[a-zA-z0-9 ]*[.][a-zA-z]");

            if (emailRegex.IsMatch(emailTextBox.Text))
            {
                emailPictureBox.Image = app.Properties.Resources.ok_icon;
            }
            else
            {
                emailPictureBox.Image = app.Properties.Resources.fault_icon;
            }
        }

ja mogę wpisać każdy znak w to pole.. walidacja będzię polegać na tym jaki obrazek zostanie wyświetlony.. A jak zastosować regexp'y, że jeśli jest 'dopasowanie' to ma dodać znać do textBoxa.. jeśli nie to nic nie robi.. (tak jakby ten klawisz nie działał..)

@dam1an - podesłany przez Ciebie kod nie uruchamiałem.. bo w sumie nie wiem czy wystraczy go tylko wrzucić i będzie działał (w co wątpie bo pewnie trzeba dodać jakieś zdarzenie czy coś w ten deseń... a nie wiem co.. ).

@Do wszystkich - wymagania są narzucone z góry i nawet jak można to zrobić to lepiej to to nie moja 'brocha'.

0

podesłany przez Ciebie kod nie uruchamiałem.. bo w sumie nie wiem czy wystraczy go tylko wrzucić i będzie działał (w co wątpie bo pewnie trzeba dodać jakieś zdarzenie czy coś w ten deseń... a nie wiem co.. ).

Wystarczy wrzucić jeśli ma być zastosowany do wszystkich textboxów. Jeśli tylko do konkretnego to dodajesz event PreviewTextInput i w handlerze wklejasz kod.

0

@dam1an - chyba coś tu nie gra.. Próbowałem najpierw znaleźć taki event..bo potrzebuje pod konkretny textBox (bez skutku). Następnie wrzuciłem twój kod i mam błąd składniowy... Jeżeli dobrze poszukałem w G. to to zdarzenie jest przewidziane dla wpf .. A ja jestem pod windows forms..

0

@furious programming - właśnie znalazłem rozwiązanie.. co prawda inne ale działa :)

podrzucam: (chodziło o zdarzenie KeyPress ..)

 private void firstNameTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
           
            if (Char.IsLetter(e.KeyChar) || e.KeyChar == '\b')
                e.Handled = false;
            else
                e.Handled = true;
        } 
0

Można i tak, tyle że Twoje rozwiązanie służy do czegoś innego; To proponowane ma jedynie sprawdzać poprawność wprowadzonych danych, nie blokując wpisywania znaków niedozwolonych, zaś Twoje nowe rozwiązanie blokuje możliwość wpisania innych znaków niż litery;

Ale jeśli takie zabezpieczenie chcesz mieć, to po problemie :]


A tak przy okazji - można krócej:

private void firstNameTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
  e.Handled = !(Char.IsLetter(e.KeyChar) || e.KeyChar == '\b');
}
0

@furious programming - właśnie mi o takie (moje) rozwiązanie chodziło :) (i o tym był głównie wątek :P)
Zapis rzeczywiście można skrócić :)

0

W takim razie albo tytuł wątku jest niepoprawny, albo zmieniłeś nagle zdanie co do tego, co chcesz uzyskać; Dlatego że Ty teraz walidujesz wciskane klawisze, a nie znajdujące się w textBox imię.

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