private void topouts_TextChanged(object sender, EventArgs e)
{
int x;
int.TryParse(topouts.Text, out x);
if (x>0 & x<=16)
{
core.TopOuts = x;
logbox.Text = $" core.TopOuts-> {topouts.Text.Length}";//не важно
}
else
{ topouts.Text = topouts.Text.Remove(topouts.Text.Length-1);
topouts.SelectionStart = topouts.Text.Length;
}
В общем код должен проверять,что пользователь вводит 16<=число<0. Но при вводе символа или если ввести символ и стереть его выводи ошибку что значение StartIndex не может быть меньше нуля(если что там специально затирается последний символ,что бы пользователь после 1 не мог 9 например ввести).Я понимаю почему выводит ошибку если ввести символ/число и стереть его,но почему при вводе просто символа(не числа) выводит ошибку, я не понимаю.Обьясните плиз) меня если что интересует только вышепоставленный вопрос так как возникновение других ошибок я понимаю.
ваша проблема тут:
topouts.Text.Remove(topouts.Text.Length-1)
для пустой строки "".Length-1 == -1
, Remove
принимает строго положительные индексы и 0.
Вторая проблема - событие TextChanged
срабатывает после любого присваивания значения свойству TextBox.Text
, а так как вы при предыдущем срабатывании удалили некорректный символ - на входе опять будет пустая строка. Т.е. фактически у вас получается косвенная рекурсия (присваивание - обработчик - присваивание - обработчик - ...), в результате символы будут удаляться до тех пор, пока значение не станет корректным, либо строка не кончится и произойдет исключение.
По поводу исправления, я бы советовал не затирать символы за пользователя, а только проверять корректность ввода. Если ввод некорректный - перекрасить цвет фона в красный например, чтобы пользователь видел введенное значение. Ну и подсказка всплывающая или просто Label
под полем мелким шрифтом, о допустимых значениях. Почему именно так - ну хотя бы потому, что в этом случае не возникнет проблем при вставке значения из буфера обмена и не придется дополнительно обрабатывать и этот случай.
Ну ок, пусть будет тут:
private void topouts_TextChanged(object sender, EventArgs e)
{
if(string.IsNullOrEmpty(topouts.Text))
{
this.topouts.BackColor = System.Drawing.SystemColors.Window;
return;
}
int x;
if(int.TryParse(topouts.Text, out x) && x >= 0 && x <= 16)
{
core.TopOuts = x;
this.topouts.BackColor = System.Drawing.SystemColors.MenuHighlight;
logbox.Text = $" core.TopOuts-> {core.TopOuts}";
}
else
{
this.topouts.BackColor = System.Drawing.Color.Red;
}
}
private void topouts_TextChanged(object sender, EventArgs e)
{
int x=17;
if(topouts.Text.All(char.IsDigit)) { int.TryParse(topouts.Text, out x); }
if (topouts.Text.Length == 0) { this.topouts.BackColor =
System.Drawing.SystemColors.Window; }
if (x>=0 && x<=16 )
{
core.TopOuts = x;
this.topouts.BackColor = System.Drawing.SystemColors.MenuHighlight;
logbox.Text = $" core.TopOuts-> {core.TopOuts}";
}
else
{
this.topouts.BackColor = System.Drawing.Color.Red;
}
}
В общем сделал чтоб подсвечивалось красным если ввод не корректный и синим если корректный,но при вводе числа больше 10000000000 фон опять становится синим...почему?
Вроде так все нормально:
private void topouts_TextChanged(object sender, EventArgs e)
{
int x=17;
if(topouts.Text.All(char.IsDigit)&& topouts.Text.Length<10) {
int.TryParse(topouts.Text, out x); }
if (topouts.Text.Length == 0) { this.topouts.BackColor =
System.Drawing.SystemColors.Window; }
if (x>=0 && x<=16 )
{
core.TopOuts = x;
this.topouts.BackColor = System.Drawing.SystemColors.MenuHighlight;
logbox.Text = $" core.TopOuts-> {core.TopOuts}";
}
else
{
this.topouts.BackColor = System.Drawing.Color.Red;
}
}
и очень хочется заменить topouts.Text.Length <10 на x.GetType().MaxValue.ToString().Lengh<10 я знаю,извращенство но можно как нибудь так?суть думаю поняли)
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Пишу игру на unity используя c# под androidСуть кода такова: Объект вращается с постоянной скоростью, но если сделать удерживающее касание (скрипт...
Как грамотно вернуть массив структур из C unmanaged кода воспользовавшись опцией LPArray? На текущий момент маршалю все в ручную, возвращая IntPtr, но хотелось...
Подскажите, пожалуйста, на что указывает и влияет начальное значение в объявлении нового объекта RandomДопустим 999, в нашем случае
возник такой вопрос : А что если допустим на компе у владельца неправильное время, тогда получается нужно его откуда-то выудить, может аля...