Mam aplikację formularzy systemu Windows z formantem pola tekstowego, który chcę akceptować tylko wartości całkowite. W przeszłości przeprowadzałem tego rodzaju walidację, przeciążając zdarzenie KeyPress i usuwając znaki, które nie pasowały do specyfikacji. Patrzyłem na kontrolkę MaskedTextBox, ale chciałbym bardziej ogólne rozwiązanie, które może działać z być może wyrażeniem regularnym lub zależeć od wartości innych kontrolek.
Idealnie byłoby, gdyby naciśnięcie znaku nieliczbowego nie przyniosło rezultatu lub natychmiast zapewniło użytkownikowi informację zwrotną na temat nieprawidłowego znaku.
Odpowiedzi:
Dwie opcje:
NumericUpDown
Zamiast tego użyj . NumericUpDown wykonuje filtrowanie za Ciebie, co jest miłe. Oczywiście daje również użytkownikom możliwość uderzania w górę i w dół strzałki na klawiaturze, aby zwiększać i zmniejszać bieżącą wartość.Obsługuj odpowiednie zdarzenia na klawiaturze, aby nie wprowadzać niczego poza wprowadzaniem numerycznym. Odniosłem sukces z tymi dwoma modułami obsługi zdarzeń w standardowym TextBox:
Możesz usunąć czek dla
'.'
(i kolejne sprawdzenie dla więcej niż jednego'.'
), jeśli TextBox nie zezwala na miejsca dziesiętne. Możesz również dodać sprawdzenie,'-'
czy TextBox powinien zezwalać na wartości ujemne.Jeśli chcesz ograniczyć liczbę cyfr użytkownika, użyj:
textBox1.MaxLength = 2; // this will allow the user to enter only 2 digits
źródło
I tylko dlatego, że zawsze fajniej jest robić rzeczy w jednym wierszu ...
UWAGA: NIE Uniemożliwia to użytkownikowi kopiowania / wklejania w tym polu tekstowym. Nie jest to bezpieczny sposób na oczyszczenie danych.
źródło
KeyPress
zdarzenia z tego samego pola tekstowego. Jedno zdarzenie może mieć wartośće.Handled
true, a następnie inne może ustawić z powrotem wartość false. Ogólnie lepiej jest używaćif (...) e.Handled = true;
TextChanged
Wydarzenie, które wykracza ponad to z regex można naprawić kopiuj-wklej;)Zakładam, że z kontekstu i użytych tagów piszesz aplikację .NET C #. W takim przypadku możesz zasubskrybować zdarzenie o zmienionym tekście i sprawdzić poprawność każdego naciśnięcia klawisza.
źródło
textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
Oto prosta, niezależna kontrolka Winforms, pochodząca ze standardowego TextBox, która pozwala tylko na wejście System.Int32 (można ją łatwo dostosować do innych typów, takich jak System.Int64 itp.). Obsługuje operacje kopiuj / wklej i liczby ujemne:
Aktualizacja 2017 : Moja pierwsza odpowiedź ma pewne problemy:
Więc wymyśliłem inną wersję, która jest bardziej ogólna, która nadal obsługuje kopiowanie / wklejanie, znak + i - itp.
W przypadku Int32 możesz albo z niego wywnioskować, jak poniżej:
lub bez pochodnej, użyj nowego zdarzenia TextValidating w następujący sposób:
ale fajne jest to, że działa z dowolnym łańcuchem i dowolną procedurą sprawdzania poprawności.
źródło
Właśnie do tego zostały zaprojektowane zdarzenia sprawdzania poprawności / sprawdzania poprawności.
Oto artykuł MSDN na ten temat: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx
Wersja TL; DR: sprawdź właściwość .Text w zdarzeniu Sprawdzanie poprawności i ustaw,
e.Cancel=True
gdy dane są nieprawidłowe.Po ustawieniu e.Cancel = True użytkownik nie może opuścić pola, ale musisz przekazać mu informację zwrotną, że coś jest nie tak. Zmieniam kolor tła pudełka na jasnoczerwony, aby wskazać problem. Pamiętaj, aby ustawić go z powrotem,
SystemColors.Window
gdy sprawdzanie poprawności jest wywoływane z dobrą wartością.źródło
Validating
.<nitpick>
OP wspomina, że natychmiastowe niedopuszczenie / wskazanie unieważniającej postaci jest idealne, aleValidating
wydaje się, że wymaga przeniesienia fokusu na inną formę / kontrolę, zanim zacznie działać.</nitpick>
Jest to jednak świetne podejście i zawsze warte rozważenia w bardziej ogólnym przypadku.Wypróbuj MaskedTextBox . Ma prosty format maski, dzięki czemu można ograniczyć wprowadzanie do liczb lub dat lub cokolwiek innego.
źródło
Możesz użyć
TextChanged
wydarzeniaźródło
Undo()
, ale powoduje toStackOverflowException
.public int txtBoxValue
, a jeśli tryParse nie działa, przywracam tekst w txtBox przeztxtBox.Text = txtBoxValue.ToString();
To może być przydatne. Pozwala na „rzeczywiste” wartości liczbowe, w tym odpowiednie kropki dziesiętne i poprzedzające znaki plus lub minus. Zadzwoń z odpowiedniego zdarzenia KeyPress.
źródło
Pracowałem nad kolekcją komponentów, aby uzupełnić brakujące elementy w WinForm, oto: Zaawansowane formularze
W szczególności jest to klasa dla Regex TextBox
Wystarczy dodać coś podobnego
myNumbericTextBox.RegexString = "^(\\d+|)$";
.źródło
Wystarczy użyć
NumericUpDown
kontrolki i ustawić te brzydkie przyciski widoczności w górę nafalse
.NumericUpDown
jest właściwie zbiorem elementów sterujących zawierających „pole przewijania” (przyciski w górę w dół), pole tekstowe i trochę kodu do sprawdzania poprawności i łączenia go w całość.Cechowanie:
ukryje przyciski, utrzymując aktywny kod podstawowy.
Chociaż nie jest to oczywiste rozwiązanie, jest proste i skuteczne.
.Controls[1]
ukryłby część pola tekstowego, jeśli chcesz to zrobić zamiast tego.źródło
Zrobiłem coś do tego na CodePlex .
Działa poprzez przechwytywanie zdarzenia TextChanged. Jeśli wynik jest dobry, zostanie zapisany. Jeśli coś jest nie tak, ostatnia dobra wartość zostanie przywrócona. Źródło jest nieco za duże, by je tutaj opublikować, ale tutaj jest link do klasy, która obsługuje rdzeń tej logiki.
źródło
po prostu użyj tego kodu w polu tekstowym:
źródło
Na naszej stronie internetowej z definicją pola tekstowego możemy dodać
onkeypress
zdarzenie, aby akceptować tylko liczby. Nie wyświetli żadnego komunikatu, ale zapobiegnie błędnemu wprowadzeniu danych. To działało dla mnie, użytkownik nie mógł wprowadzić niczego oprócz numeru.źródło
możesz użyć zdarzenia TextChanged / Keypress , użyć wyrażenia regularnego do filtrowania liczb i podjąć pewne działania.
źródło
Poradziłbym sobie z tym w przypadku KeyDown.
źródło
spróbuj to jest bardzo proste
źródło
Spójrz na obsługę danych wejściowych w WinForm
W polu tekstowym opublikowałem moje rozwiązanie wykorzystujące zdarzenia ProcessCmdKey i OnKeyPress. Komentarze pokazują, jak używać Regex do weryfikacji naciśnięcia klawisza i odpowiednio zablokować / zezwolić.
źródło
Cześć, możesz zrobić coś takiego w zdarzeniu zmienionym tekstem w polu tekstowym.
tutaj jest demo
źródło
Wygląda na to, że wiele obecnych odpowiedzi na to pytanie ręcznie analizuje tekst wejściowy. Jeśli szukasz określonego wbudowanego typu numerycznego (np.
int
Lubdouble
), dlaczego po prostu nie delegować pracy doTryParse
metody tego typu ? Na przykład:Jeśli chcesz czegoś bardziej ogólnego, ale nadal zgodnego z Projektantem Visual Studio:
I wreszcie, jeśli chcesz czegoś w pełni ogólnego i nie zależy ci na wsparciu Designer:
źródło
Należy zaakceptować zarówno liczby całkowite, jak i zmiennoprzecinkowe, w tym liczby ujemne.
źródło
Oto moje podejście:
i dowolne numery rozmiarów
źródło
Korzystając z podejścia opisanego w odpowiedzi Fabio Iottiego, stworzyłem bardziej ogólne rozwiązanie:
„ValidatedTextBox”, który zawiera wszystkie nietrywialne zachowania sprawdzania poprawności. Pozostało tylko odziedziczyć tę klasę i zastąpić metodę „IsValid” dowolną wymaganą logiką sprawdzania poprawności. Na przykład za pomocą tej klasy można utworzyć „RegexedTextBox”, który będzie akceptował tylko ciągi pasujące do określonego wyrażenia regularnego:
Następnie, dziedzicząc po klasie „RegexedTextBox”, możemy łatwo utworzyć formanty „PositiveNumberTextBox” i „PositiveFloatingPointNumberTextBox”:
źródło
Przepraszam, że obudziłem umarłych, ale pomyślałem, że ktoś może uznać to za przydatne w przyszłości.
Oto jak sobie z tym poradzić. Obsługuje liczby zmiennoprzecinkowe, ale można je łatwo modyfikować dla liczb całkowitych.
Zasadniczo można tylko nacisnąć przycisk 0 - 9 oraz .
Możesz mieć tylko jedno 0 przed .
Wszystkie pozostałe znaki są ignorowane, a pozycja kursora zostaje zachowana.
Oto szybko zmodyfikowana wersja int:
źródło
Ten działa z kopiowaniem i wklejaniem, przeciąganiem i upuszczaniem, klawiszem w dół, zapobiega przepełnieniu i jest dość prosty
źródło
Nie zapominaj, że użytkownik może wkleić nieprawidłowy tekst w pliku
TextBox
.Jeśli chcesz to ograniczyć, postępuj zgodnie z poniższym kodem:
źródło
Szukałem również najlepszego sposobu sprawdzania tylko liczb w polu tekstowym i problem z naciśnięciem klawisza polegał na tym, że nie obsługuje on wklejania kopii prawym przyciskiem myszy ani schowka, więc wymyśliłem ten kod, który sprawdza, kiedy kursor opuszcza pole tekstowe, a także sprawdza, czy puste pole. (dostosowana wersja newguy)
źródło
źródło
3 rozwiązanie
1)
2) inne rozwiązanie z msdn
}
źródło http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress(v=VS.90).aspx
3) przy użyciu MaskedTextBox: http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.aspx
źródło
Kliknij przycisk, aby sprawdzić tekst pola tekstowego za pomocą pętli:
źródło
Prostsza odpowiedź:
źródło