Текстовое поле с числовым вводом

#c# #winforms #textbox

#c# #winforms #текстовое поле

Вопрос:

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

Числа могут иметь (-) отрицательные значения с фиксированными десятичными знаками (третий параметр dPlaces), например 10000, -1000, 12345.45, -12345.45

После добавления десятичной дроби я не могу редактировать другие цифры, хотя без десятичной дроби она работает отлично.

Заранее спасибо

     public static class Util    
    {
    public static void NumInput(object sender, KeyPressEventArgs e, int dPlaces)
    {
        if (!char.IsControl(e.KeyChar) amp;amp; !char.IsDigit(e.KeyChar) amp;amp; e.KeyChar != '.' amp;amp; (e.KeyChar != '-'))
        {
            e.Handled = true;
        }

        // only allow one decimal point
        if (e.KeyChar == '.' amp;amp; (sender as TextBox).Text.IndexOf('.') > -1)
        {
            e.Handled = true;
        }

        var a = (sender as TextBox).SelectionLength;

        // only allow minus sign at the beginning
        var x = (sender as TextBox).Text.IndexOf('-');
        if (e.KeyChar == '-' amp;amp; (sender as TextBox).Text.IndexOf('-') > 0)
        {
            e.Handled = true;
        }

        if (!char.IsControl(e.KeyChar))
        {

            TextBox textBox = (TextBox)sender;

            if (textBox.Text.IndexOf('.') > -1 amp;amp;
                     textBox.Text.Substring(textBox.Text.IndexOf('.')).Length >= dPlaces   1)
            {
                e.Handled = true;
            }

        }
    }
}
  

Комментарии:

1. И вместо этого использовать NumericUpDown ? (Т.Е. Не изобретать велосипед)

2. Также примите во внимание, что пользователи могут вставлять данные в ваше текстовое поле — им не обязательно вводить.

3. NumericUpDown нельзя использовать с десятичными значениями

Ответ №1:

Это из-за логической операции в вашем БЛОКЕ IF для сравнения length = 3 и char = ‘.’.

Измените эту последнюю часть вашего кода на : (РЕДАКТИРОВАТЬ: чтобы решить проблему вставки текста перед ‘.’)

        if (!char.IsControl(e.KeyChar))
        {



            TextBox textBox = (TextBox)sender;
            // get position of new char to be inserted
            int position = textBox.SelectionStart;

            if (textBox.Text.IndexOf('.') > -1 amp;amp; position > textBox.Text.IndexOf('.')) // check location of new char

                if(!(textBox.Text.Substring(textBox.Text.IndexOf('.')).Length <= dPlaces   1))
            {
                e.Handled = true;
            }

        }
  

Это сделает вашу работу ..!!!

РЕДАКТИРОВАТЬ : также выполните следующие действия, чтобы ОСТАНОВИТЬ копирование / перенос в текстовое поле

         textbox.ShortcutsEnabled = false;
  

Комментарии:

1. Если я введу 1234.56, а затем попытаюсь вставить число от 2 до 3 (чтобы получилось 12034.56), это не сработает.