[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ń