چگونه در سی شارپ ورودی متنی ای بسازیم که فقط اعداد را قبول کند؟
یکی از سادهترین روشها برای درست کردن ورودی متنی (TextBox) که فقط ورودی عددی بگیرد استفاده از کنترل NumericUpDown است. این کنترل به طور خودکار فیلتر کردن ورودیها را انجام میدهد و همچنین به کاربر اجازه میدهد که با استفاده از دکمههای بالا و پایین در کیبورد، مقادیر را افزایش یا کاهش دهد. اگر نیاز به کنترل بیشتری دارید، میتوانید از رویداد KeyPress برای محدود کردن ورودیها استفاده کنید:
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);
}
این کد تضمین میکند که تنها اعداد و کاراکترهای کنترل (مانند دکمه Backspace) مجاز هستند. اما این رویکرد ممکن است برای ضدعفونی کردن کامل دادهها کافی نباشد، زیرا کاربر هنوز میتواند با کپی و پیست، ورودیهای نامعتبری را وارد کند.
روش دیگری برای اعتبارسنجی ورودیها در هر بار تغییر متن (با استفاده از رویداد TextChanged) وجود دارد. در این روش، با استفاده از عبارات منظم، میتوانید بررسی کنید که آیا ورودی کاربر تنها شامل اعداد است یا خیر. در صورت وجود کاراکتر غیر عددی، میتوانید به کاربر پیغام خطا ارائه دهید و کاراکتر نامعتبر را حذف کنید:
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (System.Text.RegularExpressions.Regex.IsMatch(textBox1.Text, "[^0-9]"))
{
MessageBox.Show("لطفاً فقط اعداد وارد کنید.");
textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
}
}
با این حال، این روش ممکن است در صورتی که کاربر مقداری را وسط یک رشته عددی وارد شود، رفتار عجیبی مانند پریدن نشانگر ورود کاراکتر در تکست باکس را مشاهده کند. که برای حل مشکل باید مکان کرسر را بعد از هر آپدیت بروز کرد. مانند این تکه کد:
private void numericInput_TextChanged(object sender, EventArgs e)
{
string org = numericInput.Text;
string formated = string.Concat(org.Where(c => (c >= '0' && c <= '9')));
if (formated != org)
{
int s = numericInput.SelectionStart;
if (s > 0 && formated.Length > s && org[s - 1] != formated[s - 1]) s--;
numericInput.Text = formated;
numericInput.SelectionStart = s;
}
}
در نهایت، اگر میخواهید تعداد ارقام وارد شده را محدود کنید، میتوانید از خاصیت MaxLength استفاده کنید:
textBox1.MaxLength = 2; // این به کاربر اجازه میدهد فقط 2 رقم وارد کند