удалить последний вставленный фрахтователь из текстового поля при использовании ошибки регулярного выражения

1

я использую регулярное выражение для ввода только ввода текстовых полей и попытки сделать любое не вставленное число вставлено

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

заканчивающийся контуром ошибки, который удалит все входные данные

  • 1
    Вместо того, чтобы мешать им вставлять нечисловые данные, проверяйте их, когда они отправляют форму
  • 1
    Не думайте, что числовое значение является только последним символом.
Показать ещё 2 комментария
Теги:
winforms
textbox

3 ответа

1
Лучший ответ

Для одного из них этот подход является плохой идеей, потому что вы проверяете вход в 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);
  • 1
    Это путь, если вы не хотите, чтобы не числовой ввод. Корректирующие вводные данные имеют слишком много вариантов использования, которые требуют обработки. Обработка события KeyPress игнорирует нечисловой ключ в тот момент, когда оно происходит. Например, даже если вы манипулируете текстом и помещаете курсор в конец, у пользователя есть возможность нажать стрелку влево или щелкнуть в другом месте ввода - снова, что приведет к потере проблемы ввода. Но обработка KeyPress не будет затруднена расположением курсора. Т.е. «лучше спросить разрешения здесь, чем прощения».
  • 0
    Спасибо за помощь
0

Это, вероятно, будет работать:

MessageBox.Show("insert numbers only");
if (txtNex.Text.Length > 1)
{
     Regex rgx = new Regex("([^0-9]*)");
     txtNex.Text = rgx.Replace(txtNex.Text, "");
}
0

Лучше проверить значение флажка вместо того, чтобы не вводить что-либо. Вы можете сделать что-то подобное

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;
   }
  • 0
    я всегда могу использовать чек, когда я хочу отправить, моя точка делала исправление и сообщение об ошибке при наборе
  • 2
    Во-первых, ваша логика не удобна для пользователя, а также вы предполагаете, что только последний символ не является числом, что не приведет ни к чему хорошему. То, что я написал, - лучший и простой способ сделать это.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню