View Full Version : Chỉ cho phép nhập số vào textbox trong lập trình C# neverland87 12-05-2007, 08:30 AM Thông thường, người ta dùng textbox control để nhận tất cả giá trị số do người dùng nhập vào, nhưng đôi lúc người sử dụng vì 1 lý do nào đó đã nhập không đúng quy
cách mà bạn giao kèo. Chẳng hạn, nhập 1 số lượng phần tử của mảng vào textbox, nhưng người ta lại nhập "5a" (dư chữ "a"), và chắc chắn chương trình của bạn sẽ bị lỗi. Làm sao để giải quyết tình huống này nhỉ. Bây giờ, chỉ với 1 thủ thuật đơn giản, bạn sẽ bảo textbox chỉ cho phép nhập số vào ô textbox. private void textBox1_KeyPress(object sender, KeyPressEventArgs e) if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar)) Char.IsDigit(e.KeyChar) --> kiểm tra xem phím vừa nhập vào textbox có phải là ký tự số hay không, hàm này trả về kiểu bool huynguyen 27-10-2007, 12:16 AM Ai đó hướng dẫn rõ hơn về cái này đi, sao add hàm này vào rồi mà ko có tác dụng gì cả. Sự kiện textchange có cần phải gọi cái hàm này ko? Xcross87 27-10-2007, 12:19 AM Ai đó hướng dẫn rõ hơn về cái này đi, sao add hàm này vào rồi mà ko có tác dụng gì cả. Sự kiện textchange có cần phải gọi cái hàm này ko? Cái mẫu ở trên là chỉ handle khi ấn key thôi, tức là nó check lúc keypress nhc1987 27-10-2007, 12:44 AM Tạo custom control để dành xài :D class NumericTextBox : TextBox protected override void OnKeyPress(KeyPressEventArgs e) Sự kiện textchange có cần phải gọi cái hàm này ko? Không. TextChanged đâu có liên quan gì đến KeyPress ở đây đâu :D huynguyen 27-10-2007, 02:52 AM Ko biết cách dùng cái này nên làm cái biểu thức chính quy tạm, nghiên cứu thêm >"< khacnam 27-10-2007, 06:01 PM Nếu chỉ cần ngăn chặn người ta ko nhập số mà nhập chuỗi thì nên dùng try & catch để bắt lỗi và xuất thông báo cho người ta biết Nếu chỉ cần ngăn chặn người ta ko nhập số mà nhập chuỗi thì nên dùng try & catch để bắt lỗi và xuất thông báo cho người ta biết huynguyen 27-10-2007, 06:41 PM Điều cần làm là ko cho người dùng bấm được phím ký tự, chỉ được bấm các số từ 0 - 9 mà thôi. Xuất thông báo là trò trẻ con, ai mà chẳng làm được :D Các đoạn code trên cũng chưa ngăn được người dùng copy & paste 1 chuỗi toàn text không vào control ! nhc1987 28-10-2007, 01:26 AM Các đoạn code trên cũng chưa ngăn được người dùng copy & paste 1 chuỗi toàn text không vào control ! Oạch, cái này chắc chỉ mỗi mình anh TQN nghĩ ra :D. Có cách nào remove mấy cái ContextMenu đó không anh ? (và ngược lại là add vào) huynguyen 28-10-2007, 04:02 AM Dùng biểu thức chính quy: using System.Text.RegularExpressions; Chấp copy với paste luôn, bảo đảm sạch sẽ :D Cậu huynguyen test thử code chưa, chạy như vậy user có chấp nhận không: thanhlv 29-10-2007, 10:25 PM àh,hiểu nhầm ý cậu,cứ tưởng cậu bảo chữ c là cái để làm dấu nháy(:-*) Vẫn không được, cậu test thử chưa, chữ c vẫn hiện ra, msgbox show, lúc này chữ c vẫn còn trên textbox. User click OK xong thì text của textbox mới bị empty. nhc1987 29-10-2007, 10:32 PM Vẫn không được, cậu test thử chưa, chữ c vẫn hiện ra, msgbox show, lúc này chữ c vẫn còn trên textbox. User click OK xong thì text của textbox mới bị empty. Thì mình remove cái đoạn show msgbox đi. Chứ ai lại show báo lỗi làm gì :D. Text có hơi bị giựt giựt tí nhưng có vẻ oke :D Nếu remove luôn context menu Paste, có vẻ hơi bất tiện. Ví dụ khi điền số serial (khoảng 25chars) mà bắt user gõ vào thì ... hơi bực mình :D Tuy nhiên em vẫn thích cách không cho Ctrl+V, vì sau này có thể mở rộng là add thêm một số context menu vào textbox luôn :D Không remove cái menu item Paste đâu nhc à, chỉ GetClipboardData, xem return value có phải là text string không, parse xem nó có phải là chuỗi số không. Nếu đúng thì enable Paste, còn không thì disable. thanhlv 29-10-2007, 10:39 PM nếu thích message thì code đây,nhưng cũng đâu có khác mấy cái code ở trang 1 là mấy private void textBox1_KeyPress(object sender, KeyPressEventArgs e) Trời ạ, đã nói rồi, một mình KeyPress vẫn không ngăn được user paste text string vào, cậu à ! Parse ở đây có nghĩa là kiểm tra đó nhc à, tức nếu chuỗi
đó chứa toàn ký tự số thì chấp nhận cho paste vào, còn lớn hay nhỏ là do coder xữ lý theo yêu cầu riêng từ text của textbox (nói nôm na là user của NumericEdit control của ta phải lo). 1. http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1361356&SiteId=1 1 cái là code VB .NET, 1 cái là code C++ MFC. Các cậu đọc sẽ hiểu được cách người ta làm 1 Numeric TextBox. ntdhome 28-12-2007, 11:37 PM Các anh, chi coi thử hàm IsNumeric em viết xem sao: public bool IsNumeric(string cNum) nhc1987 29-12-2007, 01:31 AM Hai bài viết anh TQN cho link ở trên là good rồi (mới đọc cái VB.net hà :D) Cách của bạn ko dùng cho số lớn. sunflower 29-12-2007, 03:40 AM Hix! Sao không dùng cái control MaskedTextBox có sẳn của VS có phải hay hơn không nhỉ. Muốn thiết lập thể nào thì thiết lập. Nhưng mấy đoạn code ở trên cũng đáng để tham khảo đó!!!! hieubm 06-01-2008, 05:19 PM Cách giải quyết hay là khi gõ hoặc paste kí tự vào thì nó gọi một hàm lọc các kí tự và bỏ đi (các bạn tham khảo Calculator của Windows chứ đâu xa). tarzan_boy 28-01-2008, 11:01 AM Hix! ai làm được up lên Demo cho mọi người cùng xem đc không? darkan 28-01-2008, 11:15 AM Hồi mới học C# cũng có làm 1 cái :D. NumericTextBox.cs using System; namespace Testing orcian 24-12-2008, 12:39 AM làm thế này thì không ctrl + v được nè private void TextBoxSoOnly_TextChanged(object sender, EventArgs e) if (TextBoxSoOnly.Text != "") đã test ! trung 24-12-2008, 01:39 PM topic này hay wa , thanks các huynh nhiều trung 24-12-2008, 01:57 PM cho mình hỏi : private bool isNumber(string val) cái trong đống ( @"^[0-9]\d*\.?[0]*$" ) ý nghĩa của nó là gì vậy ! neo8x 18-01-2009, 09:18 PM Các đoạn code trên cũng chưa ngăn được người dùng copy & paste 1 chuỗi toàn text không vào control ! Chắc phải thêm cái sự kiện TextChanged cho chắc (:X) nhc1987 01-02-2009, 01:44 AM cho mình hỏi : private bool isNumber(string val) cái trong đống ( @"^[0-9]\d*\.?[0]*$" ) ý nghĩa của nó là gì vậy ! Bạn xem tại đây nhé http://www.regular-expressions.info/ kmn104 03-02-2009, 09:59 PM Quá tuyệt, em đang tìm cái này đây, thanks bác nhiều ^^ cndragon 06-03-2009, 10:27 AM Có ai đã có bài hoàn chỉnh không cho nhập ký tự, không cho past chuỗi ký tự không vậy, ai có code hoàn chỉnh để sửa các lỗi trên thì show cho anh em tham khảo với. truonghuulong 11-03-2009, 08:33 PM Mình nghĩ có thể dùng try..catch để bắt lỗi. Nếu dùng int.Parse mà có lỗi xãy ra thì textbox đó có chứa chữ. Forlorn_hope 12-03-2009, 01:37 AM Mình nghĩ có thể dùng try..catch để bắt lỗi. Nếu dùng int.Parse mà có lỗi xãy ra thì textbox đó có chứa chữ. Đã hướng dẫn rõ rồi đó bạn. ducthiem90 12-05-2009, 08:21 AM Các đoạn code trên cũng chưa ngăn được người dùng copy & paste 1 chuỗi toàn text không vào control ! Thêm 1 ContextMenuStrip rỗng vào cho TextBox , trong sự kiện KeyPress thêm phần sử lí nhập Control nữa là OK private void textBox1_KeyPress(object sender, KeyPressEventArgs e) if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar)) xi_ke 15-05-2009, 08:53 PM Chã hju` j` hết trơn =.= nqthai05 27-05-2009, 08:56 AM vậy thì mình sử dụng kiểu dữ kiệu số như thê nào vậy bạn? usernamepro 26-06-2009, 12:44 AM Thanks nhiu nha. Mình cũng đang cần cái này. Sao You không post 1 bài về xử lý TextBox nói chung luông. Mình nghĩ như thế sẻ bổ ích cho tui minh hơn nhìu. shinichi_kudo863 29-06-2009, 12:40 AM hơi khó hiểu đấy nhỉ? black_apple 19-07-2009, 08:29 PM Thêm 1 ContextMenuStrip rỗng vào cho TextBox , trong sự kiện KeyPress thêm phần sử lí nhập Control nữa là OK private void
textBox1_KeyPress(object sender, KeyPressEventArgs e) if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar)) Nhấn ctrl+v thì không paste được gì, nhưng nhấn chuột phải rồi chọn paste thì vẫn ok [:-( hieudiep 08-08-2009, 04:28 PM Nhấn ctrl+v thì không paste được gì, nhưng nhấn chuột phải rồi chọn paste thì vẫn ok [:-( ntphivu 17-08-2009, 05:52 PM cái này mình làm được rùi freebirds 22-10-2009, 12:04 AM làm thế này thì không ctrl + v được nè private void TextBoxSoOnly_TextChanged(object sender, EventArgs e) đã test ! Tớ thấy đơn giản và nhanh gọn nhất là sài cái cách trên kết hợp với OnKeyPress nữa, phù hợp với những
tình huống gấp gáp!!! Click vào Textbox cần khởi tạo. Tronbg hộp Properties click vào Events. Trong mục KeyPress đánh vào cái gì đó tùy ý. Chỉ cho phép nhập số nguyên if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar)) Cho phép nhập số thập phân string decimalString = Thread.CurrentThread.CurrentCulture.NumberFormat.C urrencyDecimalSeparator; Chú ý : bạn phải chèn thêm code sau vào đầu chươn trình: using System.Threading; YuchiRO 25-01-2010, 04:00 PM Làm sao để hiển thị được dấu cách hàng ngàn vậy mọi người !? ví dụ nhập vào 123456 sẽ thành 123,456 Em không biết xài masked textbox :D Ah nếu xử lý được cả số thập phân luôn thì quá tuyệt ví dụ như 123456.12 sẽ được hiển thị 123,456.12 123456789.13 -- >> 123,456,789.13 Yin Yang 25-01-2010, 05:41 PM Bạn thử dùng String.Format("{0:N5}", number); duongmh 30-01-2010, 02:13 PM cái này tớ làm thì cho phép copy paste thoải mái nhưng nó sẽ tự lọc bỏ để giữ lại chuỗi kí tự số đầu tiên, còn khi gặp phải kí tự ko phải số thì xóa hết đoạn đằng sau. private void textBox1_KeyPress(object sender, KeyPressEventArgs e) if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar)) e.Handled = true; strS1=strS1.Remove(i); } } tesulakata 22-02-2010, 01:02 AM Mình dùng MaskedTextBox ( kéo nó vô form - trên đầu nó có cái set mark thì phải.. vô đó --- có kiểu số ,,số điện thoại, ngày tháng... gì gì nữa ý ) Hoặc cách nè public void Form1_Load(Object sender, EventArgs e) void maskedTextBox1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e) thanhtungdesigner 15-05-2011, 10:01 AM cái này tớ làm thì cho phép copy paste thoải mái nhưng nó sẽ tự lọc bỏ để giữ lại chuỗi kí tự số đầu tiên, còn khi gặp phải kí tự ko phải số thì xóa hết đoạn đằng sau. private void textBox1_KeyPress(object sender, KeyPressEventArgs e) if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar)) e.Handled = true; strS1=strS1.Remove(i); } } Thấy code của bạn này là ngon nhất từ đầu topic tới đây nè :D acumen 15-05-2011, 03:46 PM Bạn
thử dùng String.Format("{0:N5}", number); nếu làm theo cách đó thì khi ta đánh chữ số sẽ hiện ra phần số đánh đầu tiên bên phải và sau đó các số tiếp theo được đánh thì nó lại đánh theo chiều từ trái sang phải. neroPTIT 15-06-2011, 08:34 PM Đây là code chỉ nhập đc số n thuộc tập Q (tức là nhập đc số âm, dấu phẩy động) //Xử lí paste brianbui2009 15-06-2011, 09:31 PM Làm vầy cho lẹ: public static bool
CoPhaiSoKhong(string str) thanhendless 24-06-2011, 08:55 AM xài cái Error Provider sẽ tốt hơn đấy hirotran 29-06-2011, 07:56 AM làm thế này thì không ctrl + v được nè private void TextBoxSoOnly_TextChanged(object sender, EventArgs e) if
(TextBoxSoOnly.Text != "") đã test ! dùng try - catch kiểu này thì nếu nhập lỗi sẽ bị xóa hết số --> bất tiện cho người dùng khi nhập 1 số dài trungkien45 06-07-2011, 11:34 AM Đang làm Project, gặp vấn đề này. Để thử post cách của mình xem. (Code VB, chuyển sang C# dễ dàng) Public Class Form1 Nên tạo USRER Control. dungdok11hd 07-07-2011, 01:47 AM Dưới dây là chưong trình chỉ nhập số nguyên, số thực vào textbox không cho nhập chữ và không cho paste vào textbox. Mình viết bằng C# được chuyển từ chương trình viết bằng VB của bạn Trung Kiên. using System; string ot; if (textBox1.Text=="-") if
(nt=="") hanhsn 19-07-2011, 09:47 PM Có cách nào để nhập theo chiều từ phải sang trái nhưng số nhâp trước thì ở phía cuối bên phải, không mọi người ? Ví dụ t muốn nhập số 870 thì đánh số 0 trước rồi 7 ->8, kết quả ra 870 alicias21 01-07-2012, 09:09 PM Đang làm Project, gặp vấn đề này. Để thử post cách của mình xem. (Code VB, chuyển sang C# dễ dàng) Public Class Form1 Nên tạo USRER Control. hix, sao mình làm y hệt bạn xohlala 01-07-2012, 11:54 PM Thử chú này đi private void textBox1_KeyPress(object sender, KeyPressEventArgs e) //e.KeyChar: thêm dòng kiểm tra ngoài nếu user nhập sai cấu trúc nữa: VD -3.45.64 <-- Báo lỗi :D giangnamnam 07-07-2012, 07:53 AM Thông thường, người ta dùng textbox control để nhận tất cả giá trị số do người dùng nhập vào, nhưng đôi lúc người sử dụng vì 1 lý do nào đó đã nhập không đúng quy cách mà bạn giao kèo. Chẳng hạn, nhập 1 số lượng phần tử của mảng vào textbox, nhưng người ta lại nhập "5a" (dư chữ "a"), và chắc chắn chương trình của bạn sẽ bị lỗi. Làm sao để giải quyết tình huống này nhỉ. Bây giờ, chỉ
với 1 thủ thuật đơn giản, bạn sẽ bảo textbox chỉ cho phép nhập số vào ô textbox. private void textBox1_KeyPress(object sender, KeyPressEventArgs e) if (!Char.IsDigit(e.KeyChar) &&
!Char.IsControl(e.KeyChar)) Char.IsDigit(e.KeyChar) --> kiểm tra xem phím vừa nhập vào textbox có phải là ký tự số hay không, hàm này trả về kiểu bool private void textBox3_KeyPress(object sender, KeyPressEventArgs e) e.Handled = true; trungkien45 09-11-2014, 02:19 PM hix, sao mình làm y hệt bạn Cho mình xem code vBulletin® Version 4.2.2, Copyright © 2022 vBulletin Solutions, Inc. All rights reserved. Administer by Kevin Hoang |