TextBox, tylko cyfry

0

Witam.

Czy jest jakaś właściwość, TextBoxa, w której możemy określić, że do danego TB można wprowadzć wyłącznie cyfry?

Ewentualnie jak najlepiej oprogramować przycisk?

Mam zdarzenie, które wywoływane jest po naciśnięciu każdego klawisza. Czy w nim za każdym razem sprawdzać np. czy da się np. wykonać "Double.Parse(textBox_X1.Text);", czy jest może jakiś lepszy sposób?

0

Musisz obsłużyć zdarzenie KeyPress i sprawdzić jaki klawisz nacisnął użytkownik i zaakceptować ten znak.
Kod:


 private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
 {
            if (e.KeyChar >= '0' && e.KeyChar <= '9' || e.KeyChar == 8)// Sprawdzamy czy wciśnięty jest liczbą albo klawiszem backspace
            {
                e.Handled = false;                                     // Nie blokujemy znaku
            }
            else
            {
                e.Handled = true;                                    // W przeciwnym wypadku blokujemy znak
            }

        }

Jeśli chcesz aby można było wprowadzać liczby rzeczywiste trzeba dodać obsługę klawiszy . lub ,

I jeszcze jedno drogi Malimeo jemu nie chodziło o sprawdzanie co wprowadził użytkownik tylko żeby nie można było wprowadzać liter tylko liczby.

pozdrawiam.

0
dawx napisał(a)

I jeszcze jedno drogi Malimeo jemu nie chodziło o sprawdzanie co wprowadził użytkownik tylko żeby nie można było wprowadzać liter tylko liczby.

jednak tamten pomysł z int.TryParse czy float.TryParse jest dużo lepszy od Twojego bo odpada cała zabawa ze sprawdzaniem czy kropka jest jedna czy już była, czy plus|minus jest na początku i/lub przed e|E, itp. Wystarczy jedynie trochę pomyśleć i jest rozwiązanie odporne na każdy wpisany tekst i dodatkowo zawiera się w kilku prostych linijkach a nie w iluś tam skąplikowanych ifach

0

Jest tez zdaje sie MaskedTextBox, ale nie mialem okazji uzywac, wiec wyprobuj sam, czy Ci odpowiada.

0

Misiekd ty też nie rozumiesz o co tu chodzi. Powiem wam że jeśli w kontrolce textbox nacisniesz klawisz a to znak a nie może się pojawić w tej kontrolce. Chyba rozumiecie już...

0

nie - to Ty nie rozumiesz o co mi chodzi. I tak właśnie tak to będzie działać. Jak chcesz to napisz swoją wersję dla liczb rzeczywistych wszelkiej postaci a ja napiszę swoją wersję i je porównamy. Akceptowane postacie liczb

1234
12.34
12.34f
1.234e2
1.234e-3
1.234e+3
+1234
+12.34
+12.34f
+1.234e2
+1.234e-3
+1.234e+3
-1234
-12.34
-12.34f
-1.234e2
-1.234e-3
-1.234e+3

i pewnie jeszcze kilka innych

0

Tu nie jest ważne o co tobie chodzi tylko autorowi Posta czyli Vsq a ja go świetnie zrozumiałem i nie będę nic porównywał bo to chyba jedyna metoda o jaką chodziło Vsq no może poza tym MaskedTextBox.

0

@dawx: nie jedyna, bo mozna chocby uzyc wyrazen regularnych, zeby parsowac calosc. Jest wolniejsza, ale co jesli ktos wklei 10-znakowy tekst do kontrolki? Twoja metoda raczej go nie wylapie - bo wylapie ctrl+c, a nie tresc tekstu.

0

Masz rację jony_bravo nie uwzględniłem wklejania tekstu

0

Witam, przepraszam ze odswiezam temat ale mam ten sam problem jak opisany w tym temacie lecz zadne z powyzszych rozwiazan mi nie pomaga. Chodzi o to aby uzytkownik w textboxie mogl wpisac tylko liczby (rowniez ze znakiem aby mozna bylo podac liczbe ujemna), i uzywac backspace'a. program dziala na wartosciach typu double. Wie ktos jak to zrobic? powyzsze rozwiazania powoduja mi takie bledy:

1>c:\documents and settings\admin\moje dokumenty\visual studio 2008\projects\kalkulator liczb zespolonych\kalkulator liczb zespolonych\Form1.h(541) : error C2228: left of '.KeyChar' must have class/struct/union
1> type is 'System::KeyPressEventArgs ^'
1> did you intend to use '->' instead?
1>c:\documents and settings\admin\moje dokumenty\visual studio 2008\projects\kalkulator liczb zespolonych\kalkulator liczb zespolonych\Form1.h(541) : error C2228: left of '.KeyChar' must have class/struct/union
1> type is 'System::KeyPressEventArgs ^'
1> did you intend to use '->' instead?
1>c:\documents and settings\admin\moje dokumenty\visual studio 2008\projects\kalkulator liczb zespolonych\kalkulator liczb zespolonych\Form1.h(541) : error C2228: left of '.KeyChar' must have class/struct/union
1> type is 'System::KeyPressEventArgs ^'
1> did you intend to use '->' instead?
1>c:\documents and settings\admin\moje dokumenty\visual studio 2008\projects\kalkulator liczb zespolonych\kalkulator liczb zespolonych\Form1.h(543) : error C2228: left of '.Handled' must have class/struct/union
1> type is 'System::KeyPressEventArgs ^'
1> did you intend to use '->' instead?
1>c:\documents and settings\admin\moje dokumenty\visual studio 2008\projects\kalkulator liczb zespolonych\kalkulator liczb zespolonych\Form1.h(547) : error C2228: left of '.Handled' must have class/struct/union
1> type is 'System::KeyPressEventArgs ^'
1> did you intend to use '->' instead?

0

W pewnym projekcie rozwiązałem to zagadnienie ciut inaczej.

TextBox może być pusty. Czyli może posiadać wartość niewłaściwą (nie cyfry). Wtedy trzeba usera i tak poinformować, że nie wpisał poprawnej wartości. Więc dlaczego by user nie mógł wpisać cokolwiek, a jak wpisze coś złego to go o tym informujemy ?

Zrobiłem kontrolkę, która podświetla się na czerwono jeśli jej zawartość jest nieprawidłowa. Może takie rozwiązanie by ci odpowiadało ?

0

co do pustego textboxa to to rozwiazalem i mam informacje o tym inforumjaca usera ze pozostawil puste okno, teraz zalezy mi tylko na tym aby user mogl wpisac tylko liczby wraz ze znakiem + lub - i uzywac backspace'a

EDIT: Rozwiazalem juz moj problem i wszystko dziala, okazalo sie ze wystarczylo troche zmodyfikowac podany wczesniej kod gdyz VC++ go nie rozpoznawal :)

0

Proponuję jeszcze inny sposób ale który sprawdza zawartość TextBoxa PO wprowadzeniu ciągu znaków:

            .
            .
            .
            string dane = textbox.Text;

            if (dane == "")
            {
                MessageBox.Show("Brak liczby"); 
            }
            else
            {
                bool jest_liczba = true;
                try
                {
                    double dane_ok = System.Convert.ToDouble(dane);
                }
                catch 
                {
                    
                    MessageBox.Show("Nieprawidłowe znaki");
                    jest_liczba = false;
                }
                if (jest_liczba == true)
                {
                    //wykonywanie komend
                }
                
            }
            .
            .
            .

Dzięki użyciu try i catch nie wywala błędu o nieprawidłowym ciągu wejściowym przy konwersji string na double. Oczywiście powyższy kod jest dość toporny, ale nie wymaga definiowania akceptowanych/odrzucanych znaków.

1 użytkowników online, w tym zalogowanych: 0, gości: 1