[C#, VB.NET] Wprowadzanie tylko liczb do TextBoxa
Aby pozwolić użytkownikowi prowadzać w programie tylko liczby w TextBoxie najłatwiej zrealizować to poprzez obsłużenie zdarzenia KeyPress dla TextBoxa.
Jeśli chcemy tylko liczby naturalne, pomoże nam w tym taki kod:
C#
VB.NET
Kod ten po przechwyceniu zdarzenia KeyPress (czyli po prostu naciśnięcie klawisza na klawiaturze) sprawdza w pętli if sprawdza czy wciśnięty klawisz jest liczbą albo backspacem, jeśli tak, obsługujemy zdarzenie naciśnięcia klawisza, jeśli nie jest ustawiamy e.Handled na true, czyli informujemy, że zdarzenie zostało obsłużone i można zakończyć jego obsługę.
Jeśli chcemy obsługiwać też liczby rzeczywiste, dodatnie potrzebujemy czegoś takiego:
C#
VB.NET
Kod jest chyba wystarczająco skomentowany i nie trzeba nic dodawać :)
Jak dodać obsługę liczb ujemnych?
C#
VB.NET
Jeśli masz jeszcze jakieś pytania do tego tematu, zapraszam do skomentowania.
Jeśli chcemy tylko liczby naturalne, pomoże nam w tym taki kod:
C#
private void TextBox1_KeyPress(object sender, KeyPressEventArgs e) { if(char.IsDigit(e.KeyChar) || e.KeyChar == (char)Keys.Back) base.OnKeyPress(e); else e.Handled = true; }
VB.NET
Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress If Char.IsDigit(e.KeyChar) Or e.KeyChar = ChrW(Keys.Back) Then MyBase.OnKeyPress(e) Else e.Handled = True End If End Sub
Kod ten po przechwyceniu zdarzenia KeyPress (czyli po prostu naciśnięcie klawisza na klawiaturze) sprawdza w pętli if sprawdza czy wciśnięty klawisz jest liczbą albo backspacem, jeśli tak, obsługujemy zdarzenie naciśnięcia klawisza, jeśli nie jest ustawiamy e.Handled na true, czyli informujemy, że zdarzenie zostało obsłużone i można zakończyć jego obsługę.
Jeśli chcemy obsługiwać też liczby rzeczywiste, dodatnie potrzebujemy czegoś takiego:
C#
private void TextBox1_KeyPress(object sender, KeyPressEventArgs e) { // jeśli chcemy obsługiwać przecinek (Europa) i kropkę (USA) // możemy odwrócić znaki, by wyświetlało kropkę lub usunąć // te dwie linijki by usunąć kompatybilność tych liczb if (e.KeyChar == '.') e.KeyChar = ','; // pozwala na tylko jeden przecinek w słowie if (e.KeyChar == ',' && (sender as TextBox).Text.Contains(',')) e.Handled = true; // nie pozwala na przecinek na początku if(e.KeyChar == ',' && textBox1.SelectionStart == 0) e.Handled = true; if (char.IsDigit(e.KeyChar) || e.KeyChar == ',' || e.KeyChar == (char)Keys.Back) base.OnKeyPress(e); else e.Handled = true; }
VB.NET
Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress ' jeśli chcemy obsługiwać przecinek (Europa) i kropkę (USA) ' możemy odwrócić znaki, by wyświetlało kropkę lub usunąć ' te dwie linijki by usunąć kompatybilność tych liczb If e.KeyChar = "." Then e.KeyChar = "," End If ' pozwala na tylko jeden przecinek w słowie If e.KeyChar = "," And TryCast(sender, TextBox).Text.Contains(","c) Then e.Handled = True End If ' nie pozwala na przecinek na początku If e.KeyChar = "," And TextBox3.SelectionStart = 0 Then e.Handled = True End If If Char.IsDigit(e.KeyChar) Or e.KeyChar = "," Or e.KeyChar = ChrW(Keys.Back) Then MyBase.OnKeyPress(e) Else e.Handled = True End If End Sub
Kod jest chyba wystarczająco skomentowany i nie trzeba nic dodawać :)
Jak dodać obsługę liczb ujemnych?
C#
// nie pozwala na minus w innym mijscu niż początek if (e.KeyChar == '-' && textBox1.SelectionStart != 0) e.Handled = true; // oraz zedytuj ostatni if w taki mniej więcej sposób if (char.IsDigit(e.KeyChar) || e.KeyChar == '-' || ...
VB.NET
// nie pozwala na minus w innym mijscu niż początek If e.KeyChar = "," And TextBox3.SelectionStart > 0 e.Handled = True End If // oraz zedytuj ostatni if w taki mniej więcej sposób If Char.IsDigit(e.KeyChar) Or e.KeyChar = "-" Or ...
Jeśli masz jeszcze jakieś pytania do tego tematu, zapraszam do skomentowania.
Czekam na więcej takich wskazówek :)
OdpowiedzUsuńpoza tym fajny blog-chyba jedyny o VB.NET w polskim internecie
Dzięki za komentarz :)
UsuńJeśli masz pomysł na jakiś temat, o którym można by napisać to zapraszam a postaram się rozwinąć ten temat.
Fajnie by było napisać coś o bazach danych, które nie wymagają instalacji jak SQL Server, np. SQLite.
OdpowiedzUsuńNiestety, albo jestem zbyt słaby albo to nie działa.
OdpowiedzUsuńWybieram textbox1 zaznaczam opcje keypress czyli wszystko wygląda tak:
Private Sub FlatTextBox2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles FlatTextBox2.KeyPress
If Char.IsDigit(e.KeyChar) Or e.KeyChar = ChrW(Keys.Back) Then
MyBase.OnKeyPress(e)
Else
e.Handled = True
End If
End Sub
I niestety w textbox nadal mogę wpisywać literki :(
Piszesz, że chcesz to zrobić dla textbox1, a metodę robisz dla FlatTextBox2. Sprawdź czy na pewno dobry TextBox podpiąłeś pod to zdarzenie, bo ja sprawdziłem kod i u mnie działa.
UsuńDziękuję za odpowiedz,
UsuńNapisałem textbox1, ponieważ się pomyliłem. Wszystko w programie było zmienione na FlatTextBox2 i niestety nie działało.
Jeśli możesz napisz do mnie na gg 3336032 zamiast tutaj rozwlekać się a po prostu potem damy tutaj odpowiedź.
Ten komentarz został usunięty przez autora.
OdpowiedzUsuńWitaj a w jaki sposób zakodować zachowanie textboxa, aby można było wpisać liczbę naturalną i tylko jedną literę np "y" po cyfrze ?
OdpowiedzUsuńJak też zakodować, aby można było wpisać do textboxa tylko jedną cyfrę z zakresu od 1-5
OdpowiedzUsuń