[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#
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.

Komentarze

  1. Czekam na więcej takich wskazówek :)
    poza tym fajny blog-chyba jedyny o VB.NET w polskim internecie

    OdpowiedzUsuń
    Odpowiedzi
    1. Dzięki za komentarz :)
      Jeśli masz pomysł na jakiś temat, o którym można by napisać to zapraszam a postaram się rozwinąć ten temat.

      Usuń
  2. Fajnie by było napisać coś o bazach danych, które nie wymagają instalacji jak SQL Server, np. SQLite.

    OdpowiedzUsuń
  3. Niestety, albo jestem zbyt słaby albo to nie działa.

    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 :(

    OdpowiedzUsuń
    Odpowiedzi
    1. 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ń
    2. Dziękuję za odpowiedz,
      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ź.

      Usuń
  4. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń
  5. 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ń
  6. Jak też zakodować, aby można było wpisać do textboxa tylko jedną cyfrę z zakresu od 1-5

    OdpowiedzUsuń

Prześlij komentarz

Popularne posty z tego bloga

Singleton - wyjaśnienie czym jest

Caroline - player muzyczny ♪♫