#c# #wpf #tryparse #integerupdown
#c# #wpf #попробуйте проанализировать #integerupdown
Вопрос:
У меня есть два элемента управления IntegerUpDown, и мне нужно сравнить в MouseLeave_Event
, который я использовал int.Parse
, но когда я попробовал этот код, я получил исключение:
if (int.Parse(minUpdown.Text.ToString()) <
int.Parse(maxUpdown.Text.ToString()))
{
// do something
}
Исключение:
Input string was not in a correct format
Я искал в Stackoverflow решение, чтобы избежать этого исключения, я увидел, что лучшим решением является использование int.TryParse
, но я не знаю, как я могу использовать его в инструкции сравнения, которая возвращает логическое значение.
Сценарий, который должен быть применен, выглядит следующим образом:
- У меня уже есть
IntegerUpdown_MouseLeave_Event
и код, который я опубликовал, упоминается в событии, поэтому элементыintegerUpdown
управления могут быть пустыми или могут иметь значение, поэтому, если пользователь пытается ввести символ (не число), напримерa
, вIntegerUpDown
и этоIntegerUpDown
имеет старое значение, например3
, поэтому, когда он перемещаетмышь вне элемента управленияIntegerUpDown
должна принимать 3 вместо символа, введенного пользователем, без отображения какого-либо сообщения или какого-либо исключения.
Примечание: я бы не хотел использовать minUpdown.Value в этом случае по какой-то причине, потому что значение, которое я получаю при запуске события, является старым значением, а не значением в режиме реального времени.
Комментарии:
1. Итак, вы сравниваете
resultmin < resultmax
, но что, если один из них не сможет выполнить синтаксический анализ? Вы хотите, чтобы сравнение возвращало true или false или делало что-то совершенно другое?2. Да, я хотел бы сравнить
resultmin
, иresultmax
, если один из них не удался, он должен вернуть значение по умолчанию (предыдущее значение) и удалить символ, введенный пользователем, это то, что мне нужно3. Почему вы не используете
Value
свойство, которое возвращает anint?
? И вам не нужно сбрасывать предыдущее значение в вашем обработчике событий. Элемент управления делает это за вас, не так ли?
Ответ №1:
Ответ на первый вопрос «Как использовать TryParse и сравнить значения» выглядит следующим образом:
int.TryParse(minUpdown.Text?.ToString(), out var min);
int.TryParse(maxUpdown.Text?.ToString(), out var max);
if (min < max)
{
// do something
}
TryParse возвращает логическое значение, которое сообщает, была ли попытка выполнена успешно или нет.
Теперь, если вы хотите, чтобы ваше представление заменило неверное значение на последнее правильное значение, вам нужно сохранить его в каком-либо поле и при необходимости обновить, например:
private int lastMinValue;
private int lastMaxValue;
private void IntegerUpdown_MouseLeave_Event(object source, EventArgs args)
{
// use last value as a default for min and max
int min = lastMinValue;
int max = lastMaxValue;
// try to update min and max
if (int.TryParse(minUpdown.Text?.ToString(), out min))
{
lastMinValue = min;
}
if (int.TryParse(maxUpdown.Text?.ToString(), out max))
{
lastMaxValue = max;
}
if (min < max)
{
// do something
}
}
Комментарии:
1. Спасибо, первый работает, уже был ответ, и он был удален (но не для пустой строки, он по-прежнему выдает то же исключение), для второго ответа получить его невозможно
lastMinValue
, я расскажу вам почему. Потому что пользователь может ввести значение в первый раз и изменить другое значение, а затем ввести символ, поэтому в этом случае я могу получить только первое значение, а не предыдущее, и это проблема для меня2. Я не понимаю. Я предполагаю, что ваш
IntegerUpDown
инициализирован определенным значением, например ‘0’. Затем пользователь вручную вводит «100», затем вводит «a». Когда пользователь выводит свою мышь из-под контроля, «a» следует заменить на «100». В чем здесь проблема?3. А для нулевого значения (обратите внимание на разницу между пустой строкой и нулевым значением) вам нужно использовать оператор с нулевым условным значением (
?
символ), который возвращаетсяnull
раньше, чтобы метод цепочки не вызывался для нулевого объекта. Смотрите обновленный ответ.4. Я приму ваш ответ, но я увидел проблему с этим событием, поэтому я изменил всю работу на кнопку подтверждения,
MouseLeave_Event
это нехорошо, потому что это непрактично и может работать, только если мышь находится внутри элементаIntegerUpDown
управления, что, если она снаружи ?? => событиене будет запущено, поэтому в этом случае это вызовет большую проблему для пользователя.5. вы также можете прочитать о
focus lost
событии, обычно это событие широко используется для подтверждения введенных значений во многих технологиях пользовательского интерфейса.