PDA

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.
- Bước 1: tạo ứng dụng Windows Forms, thêm các textbox control tùy ý bạn
- Bước 2: sau khi đã có (các) textbox, bạn hãy thụ lý tình huống KeyPress của (các) textbox này. Trong đó, bạn đưa thuộc tính Handled về true để chặn các cú nhấn phím không hợp lệ. Cụ thể code như sau:


private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{

if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
e.Handled = true;
}

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
Char.IsContro(e.KeyChar) --> kiểm tra xem phím vừa nhập vào textbox có phải là các ký tự điều khiển (các phím mũi tên,Delete,Insert,backspace,space bar) hay không, mục đích dùng hàm này là để cho phép người dùng xóa số trong trường hợp nhập sai.

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
Anh có thể chuyển nó sang TextChange được mà.

nhc1987
27-10-2007, 12:44 AM
Tạo custom control để dành xài :D



class NumericTextBox : TextBox
{
public NumericTextBox()
{}

protected override void OnKeyPress(KeyPressEventArgs e)
{
if (!Char.IsControl(e.KeyChar) && !Char.IsNumber(e.KeyChar))
e.Handled = true;
}
}



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

NVL
27-10-2007, 06:04 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
try-catch chỉ dùng để bắt lỗi ngoại lệ thôi, chứ đâu thể "ép" nó để kiểm tra dữ liệu nhập vào.

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

TQN
28-10-2007, 12:47 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 !

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;
private static bool IsNumber(string val)
{
if (val != "")
return Regex.IsMatch(val, @"^[0-9]\d*\.?[0]*$");
else return true;
}
private void txtAddTSa1_TextChanged(object sender, EventArgs e)
{
if (IsNumber(txtAddTSa1.Text) != true)
{
MessageBox.Show("Dữ liệu nhập không hợp lệ, không được nhập ký tự", "Thông báo");
txtAddTSa1.Text = "";
}
}

Chấp copy với paste luôn, bảo đảm sạch sẽ :D

TQN
29-10-2007, 07:36 PM
Cậu huynguyen test thử code chưa, chạy như vậy user có chấp nhận không:
VD textbox này được dùng để nhập số ĐT, user nhâp: 090300100c, chử c sẽ display lên textbox, msgbox show lên, xóa hết, user phải nhập lại.
Hay nhất là dùng KeyPressed và hook WM_CONTEXTMENU = subclass WndProc

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(:-*)
nhưng cách của cậu trên cũng vẫn dùng được bằng cách chỉ xóa phần tử cuối cùng của chuỗi hiện hành thay bằng gán luôn cho nó là " "

TQN
29-10-2007, 10:29 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.
Vẫn chưa chấp nhận được, làm sao mà user không gõ chữ c vào được, chữ c không hiện ra, không past được....
Phải hook thêm Ctrl-V nữa.

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

TQN
29-10-2007, 10:38 PM
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)
{
if (!char.IsNumber(e.KeyChar))
{
MessageBox.Show("Chỉ nhập kí tự số");
e.Handled =true;
}
}

TQN
29-10-2007, 10:46 PM
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 à !

TQN
29-10-2007, 10:56 PM
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).
Thôi, để tui search cho các cậu luôn, bàn tán tới giờ:


1. http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1361356&SiteId=1
2. http://www.codeguru.com/cpp/controls/editctrl/maskededitcontrols/article.php/c9771__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)
{
double result;
return double.TryParse(cNum, System.Globalization.NumberStyles.Any, System.Globalization.NumberFormatInfo.CurrentInfo, out result);
}

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.
Hôm nay tìm lại mới đc up lên cho mọi người tham khảo.Có gì sai sót thì chỉnh hộ nhé :D.Hồi ấy viết còn lung tung, nhưng giờ ngại ko muốn sửa:D.

NumericTextBox.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace Testing
{
using System;
using System.Windows.Forms;
public class NumericTextBox : TextBox
{
int WM_KEYDOWN = 0x0100,
WM_PASTE = 0x0302;
public override bool PreProcessMessage(ref Message msg)
{
if (msg.Msg == WM_KEYDOWN)
{
Keys keys = (Keys)msg.WParam.ToInt32();
bool numbers = ((keys >= Keys.D0 && keys <= Keys.D9)
|| (keys >= Keys.NumPad0 && keys <= Keys.NumPad9));
bool ctrl = keys == Keys.Control;
bool ctrlZ = keys == Keys.Z && ModifierKeys == Keys.Control,
ctrlX = keys == Keys.X && ModifierKeys == Keys.Control,
ctrlC = keys == Keys.C && ModifierKeys == Keys.Control,
ctrlV = keys == Keys.V && ModifierKeys == Keys.Control,
del = keys == Keys.Delete,
bksp = keys == Keys.Back,
dot = keys == Keys.Decimal,
arrows = (keys == Keys.Up)
| (keys == Keys.Down)
| (keys == Keys.Left)
| (keys == Keys.Right);
if (numbers | ctrl | del | bksp
| arrows | ctrlC | ctrlX | ctrlZ)
return false;
else if (ctrlV)
{
IDataObject obj = Clipboard.GetDataObject();
string input = (string)obj.GetData(typeof(string));
foreach (char c in input)
{
if (!char.IsDigit(c)) return true;
}
return false;
}
else
return true;
}
else
return base.PreProcessMessage(ref msg);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_PASTE)
{
IDataObject obj = Clipboard.GetDataObject();
string input = (string)obj.GetData(typeof(string));
foreach (char c in input)
{
if (!char.IsDigit(c))
{
m.Result = (IntPtr)0;
return;
}
}
}
base.WndProc(ref m);
}
}
}

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 != "")
{
try
{
int u = Int32.Parse(TextBoxSoOnly.Text.Trim());
}
catch
{
MessageBox.Show(" ko duoc nhap chu~ cai' em oi ;)) ");
TextBoxSoOnly.Text = "";
TextBoxSoOnly.Focus();
return;
}
}
}

đã 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)
{
if (val != "")
return Regex.IsMatch(val, @"^[0-9]\d*\.?[0]*$");
else return true;
}

cái trong đống ( @"^[0-9]\d*\.?[0]*$" ) ý nghĩa của nó là gì vậy !
thanks nhiều

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)
{
if (val != "")
return Regex.IsMatch(val, @"^[0-9]\d*\.?[0]*$");
else return true;
}

cái trong đống ( @"^[0-9]\d*\.?[0]*$" ) ý nghĩa của nó là gì vậy !
thanks nhiều

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.
Đối với dạng này, kỹ thuật Regular Expressions là hay nhất. Tuy rằng cú pháp kiểm tra hơi rối mắt tí, nhưng bù lại nó lại rất hiệu quả.

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))
e.Handled = true;
else
if (Char.IsControl(e.KeyChar))
{
int ma = (int)e.KeyChar;
if ((ma == 26) || (ma == 24) || (ma == 3) || (ma == 22) || (ma == 1))
e.Handled = true;
}
}

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?
Mình đann định làm đề tài về lập máy tính bỏ túi bằng C# nè bạn giúp mình với!!!!!!!!!!!!

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))
e.Handled = true;
else
if (Char.IsControl(e.KeyChar))
{
int ma = (int)e.KeyChar;
if ((ma == 26) || (ma == 24) || (ma == 3) || (ma == 22) || (ma == 1))
e.Handled = true;
}
}

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 [:-(
Tại bạn chưa add contextMenuStrip rỗng vào textbox đấy.Code đã test rất ổn.
Nhân tiện bàn luận về cái này ,các bạn cho hỏi thêm nếu ta nhập số thực có dấu phẩy thì làm thế nào???

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)
{
if (TextBoxSoOnly.Text != "")
{
try
{
int u = Int32.Parse(TextBoxSoOnly.Text.Trim());
}
catch
{
MessageBox.Show(" ko duoc nhap chu~ cai' em oi ;)) ");
TextBoxSoOnly.Text = "";
TextBoxSoOnly.Focus();
return;
}
}
}

đã 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!!!
Những cách pro hơn thì sau khi hoàn thành công việc mình tìm hiểu tiếp!
Thanks! Y(:D

Hira
13-01-2010, 02:34 PM
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 ý.
Lúc đó nó sẽ hiện ra khung để nhập code
bạn chỉ cần parse sau vào thôi

Chỉ cho phép nhập số nguyên

if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
e.Handled = true;

Cho phép nhập số thập phân

string decimalString = Thread.CurrentThread.CurrentCulture.NumberFormat.C urrencyDecimalSeparator;
char decimalChar = Convert.ToChar(decimalString);
if (Char.IsDigit(e.KeyChar) || Char.IsControl(e.KeyChar)) { }
else if (e.KeyChar == decimalChar && this.Text.IndexOf(decimalString) == -1) { }
else
{
e.Handled = true;

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);
Số 5 là số chữ số thập phân hiển thị

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;
if (!(textBox1.Text == ""))
{
textBox1.Text += e.KeyChar;
}
}
}
private void textBox1_TextChanged_1(object sender, EventArgs e)
{
int intLengh = textBox1.Text.Length;
if (textBox1.Text != "")
{
string strS1 = textBox1.Text;
for (int i = 0; i < intLengh; i++)
{
int intASCII = (int)strS1[i];
if (intASCII <= 48 || intASCII >= 57)
{

strS1=strS1.Remove(i);
break;
}

}
if (strS1.Length< intLengh)
{
textBox1.Text = strS1;
}
}

}

tesulakata
22-02-2010, 01:02 AM
Mình dùng MaskedTextBox
xong rùi nhào vô cái properties của nó nghịch nghợm nó chút

( 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)
{
// Other initialization code
maskedTextBox1.Mask = "000";
maskedTextBox1.MaskInputRejected += new MaskInputRejectedEventHandler(maskedTextBox1_MaskI nputRejected);
}

void maskedTextBox1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
{
toolTip1.ToolTipTitle = "Invalid Input";
toolTip1.Show("We're sorry, but only digits (0-9) are allowed in dates.", maskedTextBox1, maskedTextBox1.Location, 5000);
}

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;
if (!(textBox1.Text == ""))
{
textBox1.Text += e.KeyChar;
}
}
}
private void textBox1_TextChanged_1(object sender, EventArgs e)
{
int intLengh = textBox1.Text.Length;
if (textBox1.Text != "")
{
string strS1 = textBox1.Text;
for (int i = 0; i < intLengh; i++)
{
int intASCII = (int)strS1[i];
if (intASCII <= 48 || intASCII >= 57)
{

strS1=strS1.Remove(i);
break;
}

}
if (strS1.Length< intLengh)
{
textBox1.Text = strS1;
}
}

}

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);
Số 5 là số chữ số thập phân hiển thị

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.
Minh họa cho dễ hiểu
Khi muốn đánh 123,456.00000 thì làm theo cách trên ta đánh 6 đầu tiên thì nó sẽ hiện ra "6.00000" giờ nhập số tiếp theo như 45 thêm chẳng hạn thì nó lại hiện thành 54. èo (:-)??

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)
Paste thì lọc lấy số trong chuỗi, dấu '-' nếu nó đứng trước kí tự số, dấu '.' đầu tiên và đứng sau ít nhất 1 kí tự số.
Các bác xem và cho ý kiến:

//Xử lí paste
private void textBox1_TextChanged(object sender, EventArgs e)
{
bool flag1 = true, flag2 = false, flag3 = true;
string s = textBox1.Text;
if (s!="")
{
for (int i = 0; i < s.Length; i++ )
{
if (s[i]=='-' && flag1==true)
{
flag1 = false;
}
else
{
if (s[i]=='.' && flag2==true && flag3==true)
{
flag2 = false;
flag3 = false;
}
else
{
if (!Char.IsDigit(s[i]))
s = s.Remove(i, 1);
else
{
flag1 = false;
flag2 = true;
}
}
}
}
textBox1.Text=s;
}
}
// Xử lí nhập từng kí tự
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
{
e.Handled = true;
if (e.KeyChar=='-')
e.Handled = false;
if (textBox1.Text!="" && e.KeyChar=='.')
{
bool flag = true;
foreach (char c in textBox1.Text)
if (c=='.')
flag = false;
e.Handled = !flag;
}
}
}

brianbui2009
15-06-2011, 09:31 PM
Làm vầy cho lẹ:


public static bool CoPhaiSoKhong(string str)
{
try
{
float a = float.Parse(str);
return true;
}
catch (Exception)
{
return false;
}
}

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 != "")
{
try
{
int u = Int32.Parse(TextBoxSoOnly.Text.Trim());
}
catch
{
MessageBox.Show(" ko duoc nhap chu~ cai' em oi ;)) ");
TextBoxSoOnly.Text = "";
TextBoxSoOnly.Focus();
return;
}
}
}

đã 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
Dim oldtext As String = ""
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
Dim newtext As String = TextBox1.Text
Dim i As Integer
If newtext = "" Then
oldtext = ""
Exit Sub
End If
If Integer.TryParse(newtext, i) Then
oldtext = newtext
Else
TextBox1.Text = oldtext
End If
End Sub
End Class


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;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.Collections;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

string ot;
private void textBox1_TextChanged(object sender, EventArgs e)
{
string nt = textBox1.Text;
double a;

if (textBox1.Text=="-")
{
return;
}

if (nt=="")
{
ot = "";
}
else
{
if (double.TryParse(nt, out a))
{
ot = nt;
}
else
{
textBox1.Text = ot;
}
}
}
}
}

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
Dim oldtext As String = ""
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
Dim newtext As String = TextBox1.Text
Dim i As Integer
If newtext = "" Then
oldtext = ""
Exit Sub
End If
If Integer.TryParse(newtext, i) Then
oldtext = newtext
Else
TextBox1.Text = oldtext
End If
End Sub
End Class


Nên tạo USRER Control.

hix, sao mình làm y hệt bạn
mà đến dòng TextBox1.Text = oldtext thì nó ko gán chuỗi dc, mặc dù vẫn chạy dòng đó (ko báo lỗi gì cả)
VD: textbox1 mình nhập "1a", thì đáng ra nó phải trở thành "1", đằng này nó gán ko dc nên vẫn là "1a"
ai bik giúp mình với, sắp tới hạn nộp bài rồi :((

xohlala
01-07-2012, 11:54 PM
Thử chú này đi


private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if ((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 46 && e.KeyChar != 45 && e.KeyChar!=8)
e.Handled = true;
}


//e.KeyChar:
//Từ 48 -> 57: là ký tự '0' đến '9'
//8: Nút Backspace
//46: Là ký tự '.' : nhập số thực
//45: Là ký tự '-' : nhập số âm


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.
- Bước 1: tạo ứng dụng Windows Forms, thêm các textbox control tùy ý bạn
- Bước 2: sau khi đã có (các) textbox, bạn hãy thụ lý tình huống KeyPress của (các) textbox này. Trong đó, bạn đưa thuộc tính Handled về true để chặn các cú nhấn phím không hợp lệ. Cụ thể code như sau:


private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{

if (!Char.IsDigit(e.KeyChar) && !Char.IsControl(e.KeyChar))
e.Handled = true;
}

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
Char.IsContro(e.KeyChar) --> kiểm tra xem phím vừa nhập vào textbox có phải là các ký tự điều khiển (các phím mũi tên,Delete,Insert,backspace,space bar) hay không, mục đích dùng hàm này là để cho phép người dùng xóa số trong trường hợp nhập sai.
Đơn giản là làm thế này,tại Textbox cần bắt lỗi thêm sự kiện keypress và làm như sau:

private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
{
//bat loi textbox ko cho phep nguoi dung nhap vao textbox dang chu ma fai nhap dang so
char ch = e.KeyChar;
if(!char.IsDigit(ch) && ch!=8){

e.Handled = true;
MessageBox.Show("Sai dinh dang,chi nhap vao so!");
}
}
ch!=8 ở trên có nghĩa là gì,nghĩa là trong bảng mã ASCII số 8 trong hệ thập phân chính là phím Backspace,khi thực hiện việc kiểm tra chuỗi kí tự nhập vào,nếu cái thằng IsDigit(ch) này kiểm tra thấy chuỗi kí tự nhập vào đúng là dạng số thì thôi ko bắt lỗi nữa,nếu là dạng chữ thì sẽ bắt lỗi và cho phép người dùng dùng phím Backspace để xóa ngược lại cái chuỗi vừa nhập vào không đúng đinh dạng...Have Good Success!

trungkien45
09-11-2014, 02:19 PM
hix, sao mình làm y hệt bạn
mà đến dòng TextBox1.Text = oldtext thì nó ko gán chuỗi dc, mặc dù vẫn chạy dòng đó (ko báo lỗi gì cả)
VD: textbox1 mình nhập "1a", thì đáng ra nó phải trở thành "1", đằng này nó gán ko dc nên vẫn là "1a"
ai bik giúp mình với, sắp tới hạn nộp bài rồi :((

Cho mình xem code