Numeric TextBox - przy użyciu Double.TryParse
Wiem, że to odwieczne pytanie z wieloma odpowiedziami, ale nie znalazłem żadnej dobrej, wiarygodnej odpowiedzi.
Wymagane jest pole tekstowe, które zawsze będzie zawierało ciąg, w którym Double.TryParse zwróci wartość true.
Większość implementacji, które widziałem, nie chroni przed danymi wejściowymi, takimi jak „10.45.8”. To jest problem.
Preferowany sposób, aby zrobić to całkowicie ze zdarzeniami takimi jak TextInput i KeyDown (dla spacji). Problem z nimi polega na tym, że dość trudno jest uzyskać ciąg reprezentujący nowy tekst, zanim został zmieniony (lub stary tekst po zmianie). Problem z TextChanged polega na tym, że uniemożliwia pobranie starego tekstu.
Gdybyś mógł w jakiś sposób uzyskać nowy tekst, zanim się zmieni, byłoby to najbardziej pomocne, ponieważ możesz przetestować go z Double.TryParse. Jednak może być lepsze rozwiązanie.
Jak najlepiej to zrobić?
Najlepszą odpowiedzią na to pytanie jest taka, która zawiera kilka podejść i porównuje je.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
3 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Podejście 1
Użyj kombinacji zdarzeń i dla . W możesz zapisać bieżący tekst w polu tekstowym, a następnie ustawić w zdarzeniu . Jeśli wprowadzony tekst jest nieprawidłowy, powrócisz do starej wartości tekstowej. Będzie to wyglądać tak:
jest przydatny, aby nie denerwować użytkownika na śmierć, przesuwając kursor na pierwszą pozycję w przypadku nieudanego testu. Jednak ta metoda nie przechwytuje naciśnięcia klawisza SpaceBar. Umożliwi to wprowadzenie następującego tekstu: „1234,56
„Ponadto wstawianie tekstu nie będzie prawidłowo sprawdzane. Poza tym nie lubię bawić się programami obsługi zdarzeń podczas aktualizowania tekstu”.
Podejście 2
Takie podejście powinno odpowiadać Twoim potrzebom.
Użyj modułów obsługi zdarzeń i . Obserwując te zdarzenia i odpowiednio je obsługując, nie musisz się martwić o powrót do poprzedniej wartości tekstowej w polu tekstowym. może służyć do obserwowania i ignorowania naciśnięcia klawisza spacji, podczas gdy < code> PreviewTextInput może służyć do weryfikacji nowej wartości pola tekstowego przed jej przypisaniem.
To podejście lepiej sprawdza się w wychwytywaniu nieprawidłowych danych wejściowych, zanim trafią one w pole tekstowe. Jednak ustawienie zdarzenia na może spowodować kłopoty, jak sądzę, w zależności od pozostałych miejsc docelowych na liście routingu wiadomości. Ostatnią częścią, która nie jest tutaj obsługiwana, jest możliwość wstawienia przez użytkownika nieprawidłowych danych wejściowych do pola tekstowego. Można to zrobić, dodając ten kod, który jest zbudowany w oparciu o pliki
Wklej zdarzenia w WPF TextBox
https://coderoad.ru/3061475/
.
Dodaj tę procedurę obsługi z tym kodem po wywołaniu :
Anonimowy użytkownik
Potwierdzenie od:
projekt github jako WpfEx
https://github.com/SergeyTeplyakov/WpfEx
(patrzeć na
TextBoxBehavior.cs
https://github.com/SergeyTeply ... or.cs
i
TextBoxDoubleValidator.cs
https://github.com/SergeyTeply ... or.cs
).
Odpowiedź Adama S. jest bardzo dobra, ale musimy wziąć pod uwagę również kilka innych przypadków narożnych.
Kopiując wynikowy tekst do naszego modułu obsługi zdarzeń , musimy wziąć pod uwagę, że użytkownik może zaznaczyć tekst w polu tekstowym, a nowe dane wejściowe go zastąpią. Dlatego musimy użyć czegoś takiego:
I musimy użyć tej samej logiki, kiedy obsługujemy zdarzenie OnPaste.
Nie możemy użyć prostego Double.TryParse, ponieważ użytkownik może wpisać „+”. Aby wprowadzić „+.1” („+.1” jest absolutnie poprawnym ciągiem znaków podwójnych), więc nasza metoda walidacji musi zwracać wartość true dla łańcuchów ” +. 'lub' -. '(Stworzyłem nawet oddzielną klasę o nazwie i zestaw testów jednostkowych, ponieważ ta logika jest tak ważna).
Zanim zagłębimy się w implementację, przyjrzyjmy się zestawowi testów jednostkowych, które obejmą wszystkie narożne przypadki dla metody walidacji:
Zauważ, że używam atrybutu SetCulture („en-US”), ponieważ separator dziesiętny jest „lokalny”.
Myślę, że te testy obejmują wszystkie przypadki narożne, ale dzięki temu narzędziu na wyciągnięcie ręki możesz łatwo „emulować” przypisanie użytkownikowi i przetestować (i ponownie wykorzystać) dowolne przypadki. Teraz przyjrzyjmy się metodzie :
Anonimowy użytkownik
Potwierdzenie od:
Byłbym ostrożny w sprawdzaniu poprawności danych wejściowych po każdym naciśnięciu klawisza, ponieważ może to mieć niezamierzone konsekwencje i denerwować użytkownika końcowego.
Na przykład, pamiętam, że denerwowała mnie kontrolka DatePicker, która nie zezwala na daty w przyszłości i została zainicjowana na dzisiejszą datę. Przeprowadził walidację po wpisaniu dnia, miesiąca lub roku, więc nie można było wprowadzić miesiąca/dnia późniejszego niż data bieżąca bez uprzedniej zmiany roku.
W przypadku podwójnych możesz mieć podobny problem, na przykład sugerowana przez Ciebie kontrola uniemożliwi użytkownikowi wprowadzenie idealnie prawidłowych wartości „-1”, „.12”, „1e + 5”:
Zalecałbym sprawdzenie jak zwykle, kiedy użytkownik opuszcza pole tekstowe, lub jawnie sprawdza, klikając przycisk.