Hỏi cách bắt sự kiện kiểm tra giá trị trong textbox.

Mọi người cho em hỏi em có 1 cái textbox bây giờ em chỉ muốn cho nhập số tự nhiên >=2 thì phải làm sao, nếu chỉ nhập số <=2 thì ngay lập tức sẽ có messagebox báo lỗĩ. còn nhập đúng thì sẽ làm tiếp, ở đây ý em là không cần qua 1 hàm sử lý lỗi nhập nào hết, cứ sau dấu nháy trong textbox để ta bắt đầu nhập giá trị mà ta nhập vào số<=2 thì nó báo lỗi ngay.

keydowm hoặc textchange đều đc đó bạn

làm sao bạn ?
mình làm như sau, nhưng nó vẫn làm tiếp việc đằng sau khi nào đụng đến giá trị nó mới báo.

            int n = Int32.Parse(textbox.Text);//lay gia tri cua textbox
            if (n <= 1)
            {
                MessageBox.Show("Loi ! Hay nhap lai gia tri!");
            }

[QUOTE=htc;97553]làm sao bạn ?
mình làm như sau, nhưng nó vẫn làm tiếp việc đằng sau khi nào đụng đến giá trị nó mới báo.

            int n = Int32.Parse(textbox.Text);//lay gia tri cua textbox
            if (n <= 1)
            {
                MessageBox.Show("Loi ! Hay nhap lai gia tri!");
            }

[/QUOTE]

Thế thôi. nhưng tốt nhất là đặt đoạn code trên trong sự kiện click vào nút Ok hay nút gì đó sau khi nhập xong!

Bạn có thể chọn lưu giá trị hiện tại trong một biến textbox_old nào đó để restore mỗi khi nhập giá trị bất hợp lệ hoặc reset về một giá trị mặc định nào đó.

            int n = Int32.Parse(textbox.Text);//lay gia tri cua textbox
            if (n <= 1)
            {
                MessageBox.Show("Loi ! Hay nhap lai gia tri!");
                textbox.Text = textbox_old;
                //textbox.Text = "1";
            }
            else textbox_old = textbox.Text;

[QUOTE=10520094;97551]keydowm hoặc textchange đều đc đó bạn[/QUOTE]
2 cái này xài sao bạn ? mình thử e.keydown, hay e.textchange mà không thấy gì hết, mong các pro giúp đỡ.
[QUOTE=09520243;97592]Bạn có thể chọn lưu giá trị hiện tại trong một biến textbox_old nào đó để restore mỗi khi nhập giá trị bất hợp lệ hoặc reset về một giá trị mặc định nào đó.

            int n = Int32.Parse(textbox.Text);//lay gia tri cua textbox
            if (n <= 1)
            {
                MessageBox.Show("Loi ! Hay nhap lai gia tri!");
                textbox.Text = textbox_old;
                //textbox.Text = "1";
            }
            else textbox_old = textbox.Text;

[/QUOTE]cách này cũng hay nhưng nhưng chị tạm mà thôi, tự dưng tòi ra cái textbox nữa để ko, mà lại ko ngắn gọn cái winform
[QUOTE=09520133;97588]Thế thôi. nhưng tốt nhất là đặt đoạn code trên trong sự kiện click vào nút Ok hay nút gì đó sau khi nhập xong![/QUOTE]
mình thì lại muốn nó trực tiếp kiểm tra chứ không qua nút Ok nào cả nếu nút Ok chúng ta viết luôn cái hàm xét cho nút đó cũng dk.

[QUOTE=htc;97596]2 cái này xài sao bạn ? mình thử e.keydown, hay e.textchange mà không thấy gì hết, mong các pro giúp đỡ.
cách này cũng hay nhưng nhưng chị tạm mà thôi, tự dưng tòi ra cái textbox nữa để ko, mà lại ko ngắn gọn cái winform

mình thì lại muốn nó trực tiếp kiểm tra chứ không qua nút Ok nào cả nếu nút Ok chúng ta viết luôn cái hàm xét cho nút đó cũng dk.[/QUOTE]
nếu vậy thì cậu không nên cho thông báo bằng một MessageBox như thế! giả xử cậu kiểm tra trong sự kiện Textchange, gõ vào số 123, vừa gõ số 1 cái nó xuất ra cái hộp thông báo không hợp lệ. tức không? tôi nghĩ cậu dùng sự kiện textChange của textBox đó và thông báo lỗi trong một label hoặc pictureBox (hiển thị các icon lỗi hoặc hợp lệ, tùy vào giá trị nhập)

[QUOTE=htc;97596]cách này cũng hay nhưng nhưng chị tạm mà thôi, tự dưng tòi ra cái textbox nữa để ko, mà lại ko ngắn gọn cái winform[/QUOTE]
Biến kiểu string ko chứa được giá trị textbox.Text sao?

[QUOTE=09520243;97603]Biến kiểu string ko chứa được giá trị textbox.Text sao?[/QUOTE]quên mất, vừa test thấy đúng đấy, tạm thời thì cách của bác là 1 giải pháp.hix hix

tất cả những gì anh cần là đây.
có gì sai sót nhớ nhắc em nha, em đang coi WPF nên không rành Window form lém.
anh chọn sự kiện keypress.
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
char c = e.KeyChar;
if (char.IsDigit(c) == true) //day la 1 extension method kiem tra xem e co phai la 1 numb hay khong
{
int i = Convert.ToInt32(c.ToString());// chac an hon la Conver.Toint32(c)
if (i < 2)
e.Handled = true; //lệnh này xóa kí tự vừa nhập. nếu anh muốn hiển thị 1 messageBox thì viết luôn ở đây.
}
else
e.Handled = true;
}

thế này có phải là hay hơn không? đại khái là thế!

http://www.mediafire.com/?qjj8oamfhzjer1o

bài anh Khải chưa “mềm dẻo” ở chỗ này:

  1. nếu nhập 1 kí tự khác số sẽ phát sinh 1 ngoại lệ. nên dùng try catch.
  2. nếu nhập 1 số mà nó không đúng( <2) thì số đó vẫn nằm trong textBox, không được tự động xóa đi.

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
char c = e.KeyChar; //nhan ki tu vua nhap
if (char.IsDigit(c) == true) // neu ki tu vua nhap la 1 so
{
int i = Convert.ToInt32(c.ToString()); // chuyen 1 ki tu sang so nguyen
if (i < 3)
{
e.Handled = true; //xoa ki tu sai.
MessageBox.Show(“loi nhap sai”);
}
}
else
{
e.Handled = true; //xoa ki tu sai.
MessageBox.Show(“loi nhap sai”);
}
}
đúng yêu cầu.

[QUOTE=11520327;97701]bài anh Khải chưa “mềm dẻo” ở chỗ này:

  1. nếu nhập 1 kí tự khác số sẽ phát sinh 1 ngoại lệ. nên dùng try catch.
  2. nếu nhập 1 số mà nó không đúng( <2) thì số đó vẫn nằm trong textBox, không được tự động xóa đi.[/QUOTE]
    bài của ạnh chỉ là
    [QUOTE=09520133;97696]…[SIZE=3]đại khái là thế![/SIZE][/QUOTE]

mấy cái em nói anh đều biết, xử lý dễ thôi. quan trọng là anh chỉ muốn thể hiện cái ý của chủ thớt theo cách làm của anh

P/s: Hạn chế dùng Try - catch

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)        {
            char c = e.KeyChar; //nhan ki tu vua nhap
            if (char.IsDigit(c) == true) // neu ki tu vua nhap la 1 so
            {
                int i = Convert.ToInt32(c.ToString()); // chuyen 1 ki tu sang so nguyen
                if (i < 3)
                {
                    e.Handled = true; //xoa ki tu sai.
                    MessageBox.Show("loi nhap sai");
                }
            }
            else
            {
                e.Handled = true; //xoa ki tu sai.
                MessageBox.Show("loi nhap sai");
            }
        }

theo anh biết thì e.Handled = true; là khóa sự kiện keypress chứ không phải là xóa số, nếu muốn xóa thì đơn giản em chỉ cần gán textBox1.Text=“”;

code của em nếu làm thêm chút thì sẽ khắc phục đc việc nhập chữ (Tức là chỉ cho nhập số)
còn trong trường hợp này thì như anh nói phía trên

[QUOTE=09520133;97597]… giả xử cậu kiểm tra trong sự kiện Textchange, gõ vào số 123, vừa gõ số 1 cái nó xuất ra cái hộp thông báo không hợp lệ. tức không? …[/QUOTE] :smiley:

[QUOTE=09520133;97712]

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)        {
            char c = e.KeyChar; //nhan ki tu vua nhap
            if (char.IsDigit(c) == true) // neu ki tu vua nhap la 1 so
            {
                int i = Convert.ToInt32(c.ToString()); // chuyen 1 ki tu sang so nguyen
                if (i < 3)
                {
                    e.Handled = true; //xoa ki tu sai.
                    MessageBox.Show("loi nhap sai");
                }
            }
            else
            {
                e.Handled = true; //xoa ki tu sai.
                MessageBox.Show("loi nhap sai");
            }
        }

theo anh biết thì e.Handled = true; là khóa sự kiện keypress chứ không phải là xóa số, nếu muốn xóa thì đơn giản em chỉ cần gán textBox1.Text=“”;

code của em nếu làm thêm chút thì sẽ khắc phục đc việc nhập chữ (Tức là chỉ cho nhập số)
còn trong trường hợp này thì như anh nói phía trên

:D[/QUOTE]

hình như đang có chiến tranh. hì hì, đoạn code của em đã khắc phục được việc nhập chữ rồi, không cần sửa. em làm theo đúng yêu cầu đưa ra, còn nếu muốn theo ý anh thì chỉ việc xóa câu lệnh messageBox.Show() là được. còn chuyện xóa kí tự nếu làm theo cách a là
this.textBox.Text=“” thì chẳng phải là xóa hết cả textBox rồi còn gì. ở đây chỉ cần xóa kí tự nhập sai thui mà.

[QUOTE=11520327;97727]hình như đang có chiến tranh. hì hì, đoạn code của em đã khắc phục được việc nhập chữ rồi, không cần sửa. em làm theo đúng yêu cầu đưa ra, còn nếu muốn theo ý anh thì chỉ việc xóa câu lệnh messageBox.Show() là được. còn chuyện xóa kí tự nếu làm theo cách a là
this.textBox.Text=“” thì chẳng phải là xóa hết cả textBox rồi còn gì. ở đây chỉ cần xóa kí tự nhập sai thui mà.[/QUOTE]
tùy vào cách lập trình của mỗi người thôi em. như anh thì thích nhập sai cái, có nhấn ok hay gì đó thì nó focus vào cái textbox cần sửa thôi (Bôi đen đoạn text có sẵn). cò chủ thớt muốn kiểm tra luôn trong lúc nhập thì anh làm vậy
anh nghĩ em chưa hiểu đúng ý của chủ thớt!
[QUOTE=htc;97548]em chỉ muốn cho nhập số tự nhiên >=2 thì phải làm sao[/QUOTE]
cho anh hỏi đoạn code của em có nhập đc các số dạng như số 12 không (Dạng số có số 1 hoặc số 2 đứng đầu tiến ấy)? hoặc như số 31 (số 31 rõ dàng là số tự nhiên lớn hơn 2)

à. có chỗ chủ thớt nói “cứ sau dấu nháy trong textbox để ta bắt đầu nhập giá trị mà ta nhập vào số<=2 thì nó báo lỗi ngay.”. anh chưa hiểu chỗ dấu nháy trong textbox là sao nhỉ. có thể anh hiểu sai đề :pudency: chủ thớt đâu?

P/s: Đây mới là tranh luận thôi, không phải war nhé @@

chắc ý của đề bài là chỉ cho phép kí tự nhập vào là từ ‘3’ đến ‘9’ thôi. nếu vậy thì nhập đến đâu kiểm tra đến đó. còn nếu ý của đề bài là nhập xong rùi mới kiểm tra thì… ý của em là ý 1, tức là chỉ chấp nhận 3456789 thôi. chắc chủ thớt giờ này đi ngủ rùi. dừng tại đây nha!

cứ sau dấu nháy trong textbox để ta bắt đầu nhập giá trị mà ta nhập vào số<=2 thì nó báo lỗi ngay.

em nghĩ chắc là nhập đến đâu kiểm tra đến đó. vậy đoạn code của em ok.

nhưng cần bám sát yêu cầu đề bài là nhập vào một số tự nhiên với điều kiện dàng buộc duy nhất là số đó >= 2