я использую регулярное выражение для ввода только ввода текстовых полей и попытки сделать любое не вставленное число вставлено
private void txtNex_TextChanged(object sender, EventArgs e)
{
if (System.Text.RegularExpressions.Regex.IsMatch(txtNex.Text, "[^0-9]"))
{
MessageBox.Show("insert numbers only");
if (txtNex.Text.Length > 1)
{
txtNex.Text = txtNex.Text.Substring(0, txtNex.Text.Length - 1);
}
else
{
txtNexFixPhone.Text = "0";
}
}
}
проблема в том, что она работает, есть какая-то ошибка (или моя собственная нехватка знаний), которая перемещает ввод в начало, и если я введу другой не численный, он сделает цикл, который удалит весь текст
так что скажем, я вхожу
123a
он даст мне и сообщение об ошибке и удалит "a" сейчас, если я попытаюсь ввести еще один "a", он появится перед 123
a123
заканчивающийся контуром ошибки, который удалит все входные данные
Для одного из них этот подход является плохой идеей, потому что вы проверяете вход в TextChanged
который уже слишком поздний, - там есть недопустимый символ, и теперь вам нужно его удалить - было бы лучше сделать это на KeyPress
и полностью предотвратить вход, чтобы вам вообще не нужно манипулировать текстом:
Пример:
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (!Char.IsDigit(e.KeyChar))
{
MessageBox.Show("insert numbers only");
e.Handled = true;
}
}
Если вы хотите исправить ошибку, которая перемещает ввод в начало и сохранить текущее решение, вам нужно поместить курсор в конец после того, как вы обработали текст, потому что установка нового текста в текстовое поле сбрасывает позицию курсора.
Пример:
// Manipulate the text:
txtNex.Text = txtNex.Text.Substring(0, txtNex.Text.Length - 1);
// Put the cursor at the end:
txtNex.Select(txtNex.Text.Length, 0);
Это, вероятно, будет работать:
MessageBox.Show("insert numbers only");
if (txtNex.Text.Length > 1)
{
Regex rgx = new Regex("([^0-9]*)");
txtNex.Text = rgx.Replace(txtNex.Text, "");
}
Лучше проверить значение флажка вместо того, чтобы не вводить что-либо. Вы можете сделать что-то подобное
decimal number = 0;
if(!decimal.TryParse(txtNex.Text, number))
{
//Error message
}
Если вы вводите if block
, текст в текстовом поле не может быть проанализирован до десятичного значения. Вы можете создать специальный метод проверки, который вы будете вызывать в каждом месте, когда вам нужно использовать значение текстового поля.
РЕДАКТИРОВАТЬ:
Похоже, тебе не нравится мой ответ. Вот код, который очистит не цифры
private void txtNex_TextChanged(object sender, EventArgs e)
{
string text = txtNex.Text;
string loopText = txtNex.Text;
foreach (Char c in loopText)
{
string s1 = c.ToString();
if(Regex.IsMatch(s1, "[^0-9]"))
{
if (text.Contains(s1))
text = text.Replace(s1, "");
}
}
txtNex.Text = text;
}