#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), это не сработает.