как сделать текстовое поле, которое принимает только цифры?

<p>у меня есть приложение windows forms с элементом управления textbox, которое я хочу принимать только целочисленные значения. в прошлом я делал такую проверку, перегружая событие keypress и просто удаляя символы, которые не соответствовали спецификации. я посмотрел на элемент управления maskedtextbox, но мне хотелось бы более общего решения, которое могло бы работать с, возможно, регулярным выражением или зависеть от значений других элементов управления.</p><p>в идеале это должно вести себя так, что нажатие нецифрового символа либо не даст результата, либо немедленно предоставит пользователю отзыв о недопустимом символе.</p>

<p>два варианта:</p><ol> <li><p>вместо этого используйте <a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.numericupdown(v=vs.110).aspx"><code>numericupdown</code></a> . numericupdown делает фильтрацию за вас, что приятно. конечно, это также дает вашим пользователям возможность нажимать стрелки вверх и вниз на клавиатуре, чтобы увеличивать и уменьшать текущее значение.</p></li> <li><p>обработайте соответствующие события клавиатуры, чтобы запретить что-либо, кроме числового ввода. я имел успех с этими двумя обработчиками событий в стандартном textbox:</p> <pre><code>private void textbox1\_keypress(object sender, keypresseventargs e) { if (!char.iscontrol(e.keychar) && !char.isdigit(e.keychar) && (e.keychar != '.')) { e.handled = true; } // only allow one decimal point if ((e.keychar == '.') && ((sender as textbox).text.indexof('.') > -1)) { e.handled = true; } } </code></pre></li> </ol><p>вы можете удалить проверку для <code>'.'</code> (и последующую проверку для более чем одного <code>'.'</code>), если ваш textbox не должен разрешать десятичные разряды. вы также можете добавить проверку для <code>'-'</code>, если ваш textbox должен разрешать отрицательные значения.</p><p>если вы хотите ограничить пользователя количеством цифр, используйте: <code>textbox1.maxlength = 2; // this will allow the user to enter only 2 digits</code></p>

<p>и только потому, что всегда веселее делать вещи в одну строку ...</p><pre><code> private void textbox1\_keypress(object sender, keypresseventargs e) { e.handled = !char.isdigit(e.keychar) && !char.iscontrol(e.keychar); } </code></pre><p>примечание. это не мешает пользователю копировать/вставлять в это текстовое поле. это не безопасный способ очистки ваших данных.</p>

<p>я предполагаю, что из контекста и используемых вами тегов вы пишете приложение .net c #. в этом случае вы можете подписаться на событие изменения текста и проверить каждое нажатие клавиши.</p><pre><code> private void textbox1\_textchanged(object sender, eventargs e) { if (system.text.regularexpressions.regex.ismatch(textbox1.text, "[^0-9]")) { messagebox.show("please enter only numbers."); textbox1.text = textbox1.text.remove(textbox1.text.length - 1); } } </code></pre>

<p>вот простой автономный пользовательский элемент управления winforms, полученный из стандартного textbox, который допускает только ввод system.int32 (его можно легко адаптировать для других типов, таких как system.int64 и т.д.). он поддерживает операции копирования/вставки и отрицательные числа:</p><pre><code>public class int32textbox : textbox { protected override void onkeypress(keypresseventargs e) { base.onkeypress(e); numberformatinfo fi = cultureinfo.currentculture.numberformat; string c = e.keychar.tostring(); if (char.isdigit(c, 0)) return; if ((selectionstart == 0) && (c.equals(fi.negativesign))) return; // copy/paste if ((((int)e.keychar == 22) || ((int)e.keychar == 3)) && ((modifierkeys & keys.control) == keys.control)) return; if (e.keychar == '\b') return; e.handled = true; } protected override void wndproc(ref system.windows.forms.message m) { const int wm\_paste = 0x0302; if (m.msg == wm\_paste) { string text = clipboard.gettext(); if (string.isnullorempty(text)) return; if ((text.indexof('+') >= 0) && (selectionstart != 0)) return; int i; if (!int.tryparse(text, out i)) // change this for other integer types return; if ((i < 0) && (selectionstart != 0)) return; } base.wndproc(ref m); } </code></pre><p><strong> обновление 2017 </strong>: мой первый ответ имеет некоторые проблемы:</p><ul> <li>вы можете ввести что-то длиннее целого числа данного типа (например, 2147483648 больше, чем int32.maxvalue);</li> <li>в более общем смысле, нет реальной проверки <em>результата</em> того, что было напечатано;</li> <li>он обрабатывает только int32, вам нужно написать определенный производный элемент управления textbox для каждого типа (int64 и т. д.)</li> </ul><p>поэтому я предложил другую, более общую версию, которая по-прежнему поддерживает копирование/вставку, + и - знак и т.д.</p><pre><code>public class validatingtextbox : textbox { private string \_validtext; private int \_selectionstart; private int \_selectionend; private bool \_dontprocessmessages; public event eventhandler<textvalidatingeventargs> textvalidating; protected virtual void ontextvalidating(object sender, textvalidatingeventargs e) => textvalidating?.invoke(sender, e); protected override void wndproc(ref message m) { base.wndproc(ref m); if (\_dontprocessmessages) return; const int wm\_keydown = 0x100; const int wm\_enteridle = 0x121; const int vk\_delete = 0x2e; bool delete = m.msg == wm\_keydown && (int)m.wparam == vk\_delete; if ((m.msg == wm\_keydown && !delete) || m.msg == wm\_enteridle) { dontprocessmessage(() => { \_validtext = text; \_selectionstart = selectionstart; \_selectionend = selectionlength; }); } const int wm\_char = 0x102; const int wm\_paste = 0x302; if (m.msg == wm\_char || m.msg == wm\_paste || delete) { string newtext = null; dontprocessmessage(() => { newtext = text; }); var e = new textvalidatingeventargs(newtext); ontextvalidating(this, e); if (e.cancel) { dontprocessmessage(() => { text = \_validtext; selectionstart = \_selectionstart; selectionlength = \_selectionend; }); } } } private void dontprocessmessage(action action) { \_dontprocessmessages = true; try { action(); } finally { \_dontprocessmessages = false; } } } public class textvalidatingeventargs : canceleventargs { public textvalidatingeventargs(string newtext) => newtext = newtext; public string newtext { get; } } </code></pre><p>для int32 вы можете либо извлечь его, например, так:</p><pre><code>public class int32textbox : validatingtextbox { protected override void ontextvalidating(object sender, textvalidatingeventargs e) { e.cancel = !int.tryparse(e.newtext, out int i); } } </code></pre><p>или без деривации используйте новое событие textvalidating, например:</p><pre><code>var vtb = new validatingtextbox(); ... vtb.textvalidating += (sender, e) => e.cancel = !int.tryparse(e.newtext, out int i); </code></pre><p>но что хорошо, так это то, что он работает с любой строкой и любой процедурой проверки.</p>

<p>именно для этого были разработаны события validated/validating.</p><p>вот статья msdn по этой теме: <a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx">http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx</a> </p><p>версия tl; dr: проверьте свойство .text в событии validating и установите <code>e.cancel=true</code>, если данные недействительны.</p><p>когда вы устанавливаете e.cancel = true, пользователь не может покинуть поле, но вам нужно будет дать ему некоторую обратную связь, что что-то не так. я изменил цвет фона окна на светло-красный, чтобы указать на проблему. обязательно установите его обратно в <code>systemcolors.window</code>, когда validating вызывается с хорошим значением.</p>

<p>попробуйте <a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.aspx">maskedtextbox</a> . требуется простой формат маски, чтобы вы могли ограничить ввод цифрами, датами или чем-то еще.</p>

<p>вы можете использовать событие <code>textchanged</code></p><pre><code>private void textbox\_biggerthan\_textchanged(object sender, eventargs e) { long a; if (! long.tryparse(textbox\_biggerthan.text, out a)) { // if not int clear textbox text or undo() last operation textbox\_lessthan.clear(); } } </code></pre>

<p>это может быть полезно. он допускает «реальные» числовые значения, включая правильные десятичные точки и предшествующие знаки плюс или минус. вызовите его из связанного события keypress.</p><pre><code> private bool isokfordecimaltextbox(char thecharacter, textbox thetextbox) { // only allow control characters, digits, plus and minus signs. // only allow one plus sign. // only allow one minus sign. // only allow the plus or minus sign as the first character. // only allow one decimal point. // do not allow decimal point or digits before any plus or minus sign. if ( !char.iscontrol(thecharacter) && !char.isdigit(thecharacter) && (thecharacter != '.') && (thecharacter != '-') && (thecharacter != '+') ) { // then it is not a character we want allowed in the text box. return false; } // only allow one decimal point. if (thecharacter == '.' && thetextbox.text.indexof('.') > -1) { // then there is already a decimal point in the text box. return false; } // only allow one minus sign. if (thecharacter == '-' && thetextbox.text.indexof('-') > -1) { // then there is already a minus sign in the text box. return false; } // only allow one plus sign. if (thecharacter == '+' && thetextbox.text.indexof('+') > -1) { // then there is already a plus sign in the text box. return false; } // only allow one plus sign or minus sign, but not both. if ( ( (thecharacter == '-') || (thecharacter == '+') ) && ( (thetextbox.text.indexof('-') > -1) || (thetextbox.text.indexof('+') > -1) ) ) { // then the user is trying to enter a plus or minus sign and // there is already a plus or minus sign in the text box. return false; } // only allow a minus or plus sign at the first character position. if ( ( (thecharacter == '-') || (thecharacter == '+') ) && thetextbox.selectionstart != 0 ) { // then the user is trying to enter a minus or plus sign at some position // other than the first character position in the text box. return false; } // only allow digits and decimal point after any existing plus or minus sign if ( ( // is digit or decimal point char.isdigit(thecharacter) || (thecharacter == '.') ) && ( // a plus or minus sign exists (thetextbox.text.indexof('-') > -1) || (thetextbox.text.indexof('+') > -1) ) && // attempting to put the character at the beginning of the field. thetextbox.selectionstart == 0 ) { // then the user is trying to enter a digit or decimal point in front of a minus or plus sign. return false; } // otherwise the character is perfectly fine for a decimal value and the character // may indeed be placed at the current insertion position. return true; } </code></pre>

<p>я работал над набором компонентов, чтобы завершить недостающий материал в winforms, вот он: <a href="https://bitbucket.org/bruce965/advanced-forms">расширенные формы</a> </p><p>в частности, это класс для regex textbox</p><pre><code>/// <summary>represents a windows text box control that only allows input that matches a regular expression.</summary> public class regextextbox : textbox { [nonserialized] string lasttext; /// <summary>a regular expression governing the input allowed in this text field.</summary> [browsable(false), editorbrowsable(editorbrowsablestate.never)] [designerserializationvisibility(designerserializationvisibility.hidden)] public virtual regex regex { get; set; } /// <summary>a regular expression governing the input allowed in this text field.</summary> [defaultvalue(null)] [category("behavior")] [description("sets the regular expression governing the input allowed for this control.")] public virtual string regexstring { get { return regex == null ? string.empty : regex.tostring(); } set { if (string.isnullorempty(value)) regex = null; else regex = new regex(value); } } protected override void ontextchanged(eventargs e) { if (regex != null && !regex.ismatch(text)) { int pos = selectionstart - text.length + (lasttext ?? string.empty).length; text = lasttext; selectionstart = math.max(0, pos); } lasttext = text; base.ontextchanged(e); } } </code></pre><p>достаточно просто добавить что-то вроде <code>mynumberictextbox.regexstring = "^(\\d+|)$";.

я сделал что-то для этого на <a href="http://www.codeplex.com/winformnumberbox">codeplex .он работает, перехватывая событие textchanged. если результат будет хорошим числом, он будет сохранен. если что-то не так, последнее хорошее значение будет восстановлено. источник слишком велик, чтобы публиковать здесь, но <a href="http://www.codeplex.com/winformnumberbox/sourcecontrol/changeset/view/18543#282049">здесь ссылка на класс , которая обрабатывает ядро этой логики.

просто используйте этот код в текстовом поле:private void textbox1_textchanged(object sender, eventargs e) { double parsedvalue; if (!double.tryparse(textbox1.text, out parsedvalue)) { textbox1.text = ""; } } 

на нашей веб-странице с определением текстового поля мы можем добавить событие onkeypress для принятия только чисел. он не будет показывать никаких сообщений, но предотвратит неправильный ввод. у меня это сработало, пользователь не мог ничего ввести, кроме номера.<asp:textbox runat="server" id="txtfrom" onkeypress="if(isnan(string.fromcharcode(event.keycode))) return false;"> 

просто используйте элемент управления numericupdown и установите для этих уродливых кнопок вверх-вниз значение false.numericupdown1.controls[0].visible = false; на самом деле numericupdown - это набор элементов управления, содержащий «блок прокрутки» (кнопки «вверх» и «вниз»), текстовое поле и некоторый код для проверки и объединения всех этих элементов. маркировка:yournumericupdown.controls[0].visible = false будет скрывать кнопки, оставляя основной код активным. хотя это и не очевидное решение, оно простое и эффективное. .controls[1] будет скрывать часть текстового поля, если вы захотите сделать это вместо этого.

похоже, что многие из текущих ответов на этот вопрос вручную анализируют входной текст. если вы ищете определенный встроенный числовой тип (например, int или double), почему бы просто не делегировать работу методу tryparse этого типа? например:public class inttextbox : textbox { string previoustext = ""; int backingresult; public inttextbox() { textchanged += inttextbox_textchanged; } public bool hasresult { get; private set; } public int result { get { return hasresult ? backingresult : default(int); } } void inttextbox_textchanged(object sender, eventargs e) { hasresult = int.tryparse(text, out backingresult); if (hasresult || string.isnullorempty(text)) { // commit previoustext = text; } else { // revert var changeoffset = text.length - previoustext.length; var previousselectionstart = math.max(0, selectionstart - changeoffset); text = previoustext; selectionstart = previousselectionstart; } } } если вы хотите что-то более общее, но все же совместимое с visual studio designer:public class parsabletextbox : textbox { tryparser backingtryparse; string previoustext = ""; object backingresult; public parsabletextbox() : this(null) { } public parsabletextbox(tryparser tryparse) { tryparse = tryparse; textchanged += parsabletextbox_textchanged; } public delegate bool tryparser(string text, out object result); public tryparser tryparse { set { enabled = !(readonly = value == null); backingtryparse = value; } } public bool hasresult { get; private set; } public object result { get { return getresult<object>(); } } public t getresult() { return hasresult ? (t)backingresult : default(t); } void parsabletextbox_textchanged(object sender, eventargs e) { if (backingtryparse != null) { hasresult = backingtryparse(text, out backingresult); } if (hasresult || string.isnullorempty(text)) { // commit previoustext = text; } else { // revert var changeoffset = text.length - previoustext.length; var previousselectionstart = math.max(0, selectionstart - changeoffset); text = previoustext; selectionstart = previousselectionstart; } } } и, наконец, если вы хотите что-то полностью общее и не заботитесь о поддержке designer:public class parsabletextbox : textbox { tryparser backingtryparse; string previoustext; t backingresult; public parsabletextbox() : this(null) { } public parsabletextbox(tryparser tryparse) { tryparse = tryparse; textchanged += parsabletextbox_textchanged; } public delegate bool tryparser(string text, out t result); public tryparser tryparse { set { enabled = !(readonly = value == null); backingtryparse = value; } } public bool hasresult { get; private set; } public t result { get { return hasresult ? backingresult : default(t); } } void parsabletextbox_textchanged(object sender, eventargs e) { if (backingtryparse != null) { hasresult = backingtryparse(text, out backingresult); } if (hasresult || string.isnullorempty(text)) { // commit previoustext = text; } else { // revert var changeoffset = text.length - previoustext.length; var previousselectionstart = math.max(0, selectionstart - changeoffset); text = previoustext; selectionstart = previousselectionstart; } } } 

private void txt3_keypress(object sender, keypresseventargs e) { for (int h = 58; h <= 127; h++) { if (e.keychar == h) //58 to 127 is alphabets tat will be blocked { e.handled = true; } } for(int k=32;k<=47;k++) { if (e.keychar == k) //32 to 47 are special characters tat will { be blocked e.handled = true; } } } попробуй это очень просто

должны быть приняты как целые числа, так и числа с плавающей запятой, включая отрицательные числа.<pre class="lang-c# prettyprint-override">private void textbox1_keypress(object sender, keypresseventargs e) { // text string text = ((control) sender).text; // is negative number? if (e.keychar == '-' && text.length == 0) { e.handled = false; return; } // is float number? if (e.keychar == '.' && text.length > 0 && !text.contains(".")) { e.handled = false; return; } // is digit? e.handled = (!char.isdigit(e.keychar) && !char.iscontrol(e.keychar)); } 

привет, вы можете сделать что-то вроде этого в текстовом поле события. вот демо private void textbox1_textchanged(object sender, eventargs e) { string actualdata = string.empty; char[] entereddata = textbox1.text.tochararray(); foreach (char achar in entereddata.asenumerable()) { if (char.isdigit(achar)) { actualdata = actualdata + achar; // messagebox.show(achar.tostring()); } else { messagebox.show(achar + " is not numeric"); actualdata.replace(achar, ' '); actualdata.trim(); } } textbox1.text = actualdata; } 

вы можете использовать <a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.control.textchanged.aspx">textchanged / событие нажатия клавиши, использовать регулярное выражение для фильтрации по числам и предпринять некоторые действия.

взгляните на <a href="https://stackoverflow.com/questions/294611/input-handling-in-winform">обработка ввода в winform я разместил свое решение, которое использует события processcmdkey и onkeypress в текстовом поле. в комментариях показано, как использовать регулярные выражения для проверки нажатия клавиш и соответствующего блокирования/разрешения.

используя подход, описанный в <a href="https://stackoverflow.com/a/28702150">ответ фабио иотти я создал более общее решение:public abstract class validatedtextbox : textbox { private string m_lasttext = string.empty; protected abstract bool isvalid(string text); protected sealed override void ontextchanged(eventargs e) { if (!isvalid(text)) { var pos = selectionstart - text.length + m_lasttext.length; text = m_lasttext; selectionstart = math.max(0, pos); } m_lasttext = text; base.ontextchanged(e); } } «validatedtextbox», который содержит все нетривиальное поведение валидации . все, что осталось сделать, это наследовать от этого класса и переопределить метод «isvalid» любой логикой валидации, необходимой например, используя этот класс, возможно создать «regexedtextbox», который будет принимать только строки, которые соответствуют определенному регулярному выражению:public abstract class regexedtextbox : validatedtextbox { private readonly regex m_regex; protected regexedtextbox(string regexpstring) { m_regex = new regex(regexpstring); } protected override bool isvalid(string text) { return m_regex.ismatch(text); } } после этого, наследуя от класса «regexedtextbox», мы можем легко создавать элементы управления «positivenumbertextbox» и «positivefloatingpointnumbertextbox»:public sealed class positivenumbertextbox : regexedtextbox { public positivenumbertextbox() : base(@"^d$") { } } public sealed class positivefloatingpointnumbertextbox : regexedtextbox { public positivefloatingpointnumbertextbox() : base(@"^(\d+\" + cultureinfo.currentculture.numberformat.numberdecimalseparator + @")?\d*$") { } } </code></pre>

<p>извините, что разбудил мертвых, но я подумал, что кто-то может найти это полезным для дальнейшего использования.</p><p>вот как я справляюсь с этим. он обрабатывает числа с плавающей запятой, но может быть легко модифицирован для целых чисел.</p><p>в основном вы можете нажимать только<strong> 0 </strong>-<strong> 9 </strong>и<strong>. </strong></p><p>вы можете иметь только один<strong> 0 </strong>перед<strong>. </strong></p><p>все остальные символы игнорируются и позиция курсора сохраняется.</p><pre><code> private bool \_mytextboxchanging = false; private void mytextbox\_textchanged(object sender, eventargs e) { validatetext(mytextbox); } private void validatetext(textbox box) { // stop multiple changes; if (\_mytextboxchanging) return; \_mytextboxchanging = true; string text = box.text; if (text == "") return; string validtext = ""; bool hasperiod = false; int pos = box.selectionstart; for (int i = 0; i < text.length; i++ ) { bool badchar = false; char s = text[i]; if (s == '.') { if (hasperiod) badchar = true; else hasperiod = true; } else if (s < '0' || s > '9') badchar = true; if (!badchar) validtext += s; else { if (i <= pos) pos--; } } // trim starting 00s while (validtext.length >= 2 && validtext[0] == '0') { if (validtext[1] != '.') { validtext = validtext.substring(1); if (pos < 2) pos--; } else break; } if (pos > validtext.length) pos = validtext.length; box.text = validtext; box.selectionstart = pos; \_mytextboxchanging = false; } </code></pre><p>вот быстро модифицированная версия int:</p><pre><code> private void validatetext(textbox box) { // stop multiple changes; if (\_mytextboxchanging) return; \_mytextboxchanging = true; string text = box.text; if (text == "") return; string validtext = ""; int pos = box.selectionstart; for (int i = 0; i < text.length; i++ ) { char s = text[i]; if (s < '0' || s > '9') { if (i <= pos) pos--; } else validtext += s; } // trim starting 00s while (validtext.length >= 2 && validtext.startswith("00")) { validtext = validtext.substring(1); if (pos < 2) pos--; } if (pos > validtext.length) pos = validtext.length; box.text = validtext; box.selectionstart = pos; \_mytextboxchanging = false; } </code></pre>

<p>не забывайте, что пользователь может вставить неверный текст в переменную <code>textbox</code>. </p><p>если вы хотите ограничить это, следуйте приведенному ниже коду:</p><pre><code>private void ultratexteditor1\_textchanged(object sender, eventargs e) { string append=""; foreach (char c in ultratexteditor1.text) { if ((!char.isnumber(c)) && (c != convert.tochar(keys.back))) { } else { append += c; } } ultratexteditor1.text = append; } </code></pre>

<p>я также искал лучший способ проверки только чисел в текстовом поле, и проблема с нажатием клавиш заключалась в том, что он не поддерживает копирование вставки с помощью щелчка правой кнопкой мыши или буфера обмена, поэтому придумала этот код, который проверяет, когда курсор покидает текстовое поле, а также проверяет наличие пустое поле (адаптированная версия newguy)</p><pre><code>private void txtfirstvalue\_mouseleave(object sender, eventargs e) { int num; bool isnum = int.tryparse(txtfirstvalue.text.trim(), out num); if (!isnum && txtfirstvalue.text != string.empty) { messagebox.show("the first value you entered is not a number, please try again", "invalid value detected", messageboxbuttons.ok, messageboxicon.error); txtfirstvalue.clear(); } } </code></pre>

<p>я бы обработал это в событии keydown. </p><pre><code>void textbox\_keydown(object sender, keyeventargs e) { char c = convert.tochar(e.platformkeycode); if (!char.isdigit(c)) { e.handled = true; } } </code></pre>

<p>этот работает с копированием и вставкой, перетаскиванием, клавишей вниз, предотвращает переполнение и довольно прост</p><pre><code>public partial class integerbox : textbox { public integerbox() { initializecomponent(); this.text = 0.tostring(); } protected override void onpaint(painteventargs pe) { base.onpaint(pe); } private string originalvalue = 0.tostring(); private void integerbox\_keypress(object sender, keypresseventargs e) { originalvalue = this.text; } private void integerbox\_textchanged(object sender, eventargs e) { try { if(string.isnullorwhitespace(this.text)) { this.text = 0.tostring(); } this.text = convert.toint64(this.text.trim()).tostring(); } catch (system.overflowexception) { messagebox.show("value entered is to large max value: " + int64.maxvalue.tostring(), "error", messageboxbuttons.ok, messageboxicon.error); this.text = originalvalue; } catch (system.formatexception) { this.text = originalvalue; } catch (system.exception ex) { this.text = originalvalue; messagebox.show(ex.message, "error", messageboxbuttons.ok , messageboxicon.error); } } } </code></pre>

<pre><code>here is a simple solution that works for me. public static bool numresult; public static bool checktextisnumber(string numberval) { try { if (numberval.equals(".")) { numresult = true; } else if (numberval.equals("")) { numresult = true; } else { decimal number3 = 0; bool canconvert = decimal.tryparse(numberval, out number3); if (canconvert == true) { numresult = true; } else numresult = false; } } catch (system.exception ex) { numresult = false; } return numresult; } string correctnum; private void tbox\_numtester\_textchanged(object sender, textchangedeventargs e) { if(checktextisnumber(tbox\_numtester.text)) { correctnum = tbox\_numtester.text; } else { tbox\_numtester.text = correctnum; } } </code></pre>

<p>более простой ответ:</p><pre><code>\_textbox.textchanged += delegate(system.object o, system.eventargs e) { textbox \_tbox = o as textbox; \_tbox.text = new string(\_tbox.text.where(c => (char.isdigit(c)) || (c == '.')).toarray()); }; </code></pre>

<p>это мой подход:</p><ol> <li>скопируйте/вставьте проверочный код</li> <li>сохраняет позицию каретки при нажатии запрещенного персонажа</li> <li>принимает левые нули</li> <li>и номера любого размера</li> <li><p>and any size numbers</p> <pre><code>private void numerocuenta\_textchanged(object sender, eventargs e) { string org = numerocuenta.text; string formated = string.concat(org.where(c => (c >= '0' && c <= '9'))); if (formated != org) { int s = numerocuenta.selectionstart; if (s > 0 && formated.length > s && org[s - 1] != formated[s - 1]) s--; numerocuenta.text = formated; numerocuenta.selectionstart = s; } } </code></pre></li> </ol>

<p>мне нравится краткий код</p><pre><code> private void xmm\_textbox\_keypress(object sender, keypresseventargs e) { double x; e.handled = !double.tryparse(((textbox)sender).text, out x); } </code></pre>

<pre><code>int number; bool isnumber; isnumber = int32.trypase(textbox1.text, out number); if (!isnumber) { (code if not an integer); } else { (code if an integer); } </code></pre>

<p><strong> fail-safe </strong>и простой «рекурсивный» метод, который можно использовать с несколькими текстовыми полями.</p><p>он блокирует неправильно введенные символы клавиатуры, а также вставленные значения и т.д. он принимает только целые числа, и<strong> максимальная длина числа равна максимальной длине строкового типа </strong>(что является int, очень длинным!)</p><pre><code>public void check\_if\_int\_on\_textchanged(object sender, eventargs e) { // this method checks that each inputed character is a number. any non-numeric // characters are removed from the text textbox textbox = (textbox)sender; // if the text is empty, return if (textbox.text.length == 0) { return; } // check the new text value if it's only numbers byte parsedvalue; if (!byte.tryparse(textbox.text[(textbox.text.length - 1)].tostring(), out parsedvalue)) { // remove the last character as it wasn't a number textbox.text = textbox.text.remove((textbox.text.length - 1)); // move the cursor to the end of text textbox.selectionstart = textbox.text.length; } } </code></pre>

<p>3 решение</p><p>1)</p><pre><code>//add to the textbox's keypress event //using regex for number only textbox private void txtbox\_keypress(object sender, keypresseventargs e) { if (!system.text.regularexpressions.regex.ismatch(e.keychar.tostring(), "\\d+")) e.handled = true; } </code></pre><p>2) еще одно решение от msdn</p><pre><code>// boolean flag used to determine when a character other than a number is entered. private bool nonnumberentered = false; // handle the keydown event to determine the type of character entered into the control. private void textbox1\_keydown(object sender, keyeventargs e) { // initialize the flag to false. nonnumberentered = false; // determine whether the keystroke is a number from the top of the keyboard. if (e.keycode < keys.d0 || e.keycode > keys.d9) { // determine whether the keystroke is a number from the keypad. if (e.keycode < keys.numpad0 || e.keycode > keys.numpad9) { // determine whether the keystroke is a backspace. if (e.keycode != keys.back) { // a non-numerical keystroke was pressed. // set the flag to true and evaluate in keypress event. nonnumberentered = true; } } } </code></pre><p>}</p><pre><code>private void textbox1\_keypress(object sender, keypresseventargs e) { if (nonnumberentered == true) { messagebox.show("please enter number only..."); e.handled = true; } } </code></pre><p>источник <a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress(v=vs.90).aspx">http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress(v=vs.90).aspx</a> </p><p>3) с помощью maskedtextbox: <a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.aspx">http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.aspx</a> </p>

<p>я создал <strong>re-usable textbox extension</strong> класс для всех видов проверок и подумал о том, чтобы поделиться им.</p><p>все, что вам нужно сделать, это вызвать событие <strong>textchange</strong> и затем вызвать метод validate. это выглядит так: </p><pre><code>private void tbxamount\_textchanged(object sender, eventargs e) { tbxamount.validate(textvalidator.validationtype.amount); } </code></pre><p>вот класс расширения:</p><pre><code>public static class textvalidator { public enum validationtype { amount, integer } /// <summary> /// validate a textbox on text change. /// </summary> /// <param name="tbx"></param> /// <param name="validationtype"></param> public static void validate(this textbox tbx, validationtype validationtype) { performvalidation(tbx, validationtype); tbx.select(tbx.text.length, 0); } private static void performvalidation(this textbox tbx, validationtype validationtype) { char[] enteredstring = tbx.text.tochararray(); switch (validationtype) { case validationtype.amount: tbx.text = amountvalidation(enteredstring); break; case validationtype.integer: tbx.text = integervalidation(enteredstring); break; default: break; } tbx.selectionstart = tbx.text.length; } private static string amountvalidation(char[] enteredstring) { string actualstring = string.empty; int count = 0; foreach (char c in enteredstring.asenumerable()) { if (count >= 1 && c == '.') { actualstring.replace(c, ' '); actualstring.trim(); } else { if (char.isdigit(c)) { actualstring = actualstring + c; } if (c == '.') { actualstring = actualstring + c; count++; } else { actualstring.replace(c, ' '); actualstring.trim(); } } } return actualstring; } private static string integervalidation(char[] enteredstring) { string actualstring = string.empty; foreach (char c in enteredstring.asenumerable()) { if (char.isdigit(c)) { actualstring = actualstring + c; } else { actualstring.replace(c, ' '); actualstring.trim(); } } return actualstring; } } </code></pre><p> <a href="https://gist.github.com/zaagan/e1a87ec3d411ba39f0d7d1e7e52660f8#file-textbox-validator">вы можете найти полный код здесь</a> </p>

<p>при нажатии кнопки вы можете проверить текст в текстовом поле для цикла:</p><pre><code>char[] c = txtgetcustomerid.text.tochararray(); bool isdigi = true; for (int i = 0; i < c.length; i++) { if (c[i] < '0' || c[i] > '9') { isdigi = false; } } if (isdigi) { // do something } </code></pre>