2015-03-21 2 views
0

У меня есть настраиваемый элемент управления, который содержит TextBox. Пользовательский класс имеет 3 свойства, MinValue, MaxValue и Value, определяемые как так:int.Parse not throwing exception

public int Value 
{ 
    get { return int.Parse(text.Text); } 
    set 
    { 
     text.Text = value.ToString(); 
    } 
} 

public int MaxValue { get; set; } 
public int MinValue { get; set; } 

Когда TextBox внутри пользовательского класса теряет фокус, следующий метод запуска:

void text_LostFocus(object sender, EventArgs e) 
{ 
    Value = Value > MaxValue ? MaxValue : Value; 
    Value = Value < MinValue ? MinValue : Value; 
} 

Если TextBox имеет строку, которая больше, чем 2,147,483,647, текст остается неизменным, когда фокус теряется, и исключение не генерируется.

Почему исключение не брошено, и как я могу сделать это так, он будет также установить значения выше, чем Int32.MaxValue к MaxValue, а значения ниже, чем Int32.MinValue к MinValue?

+0

Где вы ожидаете поймать Исключение? – abto

+3

Он разбивается, как тонна кирпичей, когда я пытаюсь это сделать, вы должны прятать попытку/поймать где-нибудь. Этот подход очень не прав, LostFocus - очень опасное событие, которое смышленно скрыто в дизайнере. Вместо этого используйте событие Validating и используйте int.TryParse(). И обязательно иметь дело с тем, что текст еще не введен. –

ответ

-1

Хорошо, так я нашел этот вопрос :

enter image description here

флажок внутри красного круга непроверенный себя. Может быть, когда я отремонтировал установку моей IDE (VS Express 2012).Недавно я установил VS 2012 Professional, и они используют одни и те же параметры, потому что проверка его в Professional также исправлена ​​в Express

1

Во-первых, существуют различные целые типы данных в C#.

например.

Int32 с диапазоном от -2,147,483,648 до 2,147,483,647

Int64 с диапазоном от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807

Это техническое невозможно иметь больший диапазон, используя Int32, как он использует 32bits памяти. Использование неподписанной версии типа приведет к смещению диапазона только к положительным значениям, поэтому, если вам не нужны отрицательные значения, вы также можете взглянуть на UInt32.
Для фактического увеличения диапазона, ваш единственный вариант, используя тип данных Int64.

Смотри также: https://msdn.microsoft.com/en-US/en-en/library/exx3b86w.aspx

(int является псевдонимом для Int32, long для Int64)

Во-вторых, как вы ни есть try-catch блок, ни с помощью TryParse должно быть необработанное System.OverflowException. Если нет никакого исключения, это как-то странно. Вы уверены, что это не внутри блока try-catch?

В любом случае я бы рекомендовал использовать TryParse вместо Parse и соответствующим образом обрабатывать ошибки.

+0

Вопрос в том, «почему исключение не выбрасывается». Это, похоже, не отвечает на этот вопрос. –

+0

Srsly? Прочитайте вопрос, и вы увидите, что он задает больше, чем просто этот вопрос. Мой ответ затрагивает основные два вопроса: «Как установить более высокую ценность, чем Int32.MaxValue» и «почему нет исключения», нормально для второго, может быть, это не 100% -ный ответ, но, по крайней мере, я попытался дать ему понять, что может пойти не так, и как он должен реализовать его «используя TryParse и обрабатывая ошибку, когда он терпит неудачу». Поэтому я действительно не понимаю вашу проблему, с моим ответом. – d4Rk

+0

Учитывая, какой маленький код был показан, так же вероятно, что «Int32.MaxValue» - это опечатка или, в лучшем случае, плохо объясненный элемент вопроса ... код явно просто пытается ограничить значения внутри 'MaxValue' и 'MinValue', а не весь диапазон' int', и я нахожу код более надежно выразительным, чем описательный текст. Итог: это ощущение, что это не делает ничего, чтобы ответить на реальный вопрос. Дайте мне знать, согласен ли OP с вашим ответом, и я с радостью откажусь от моего комментария, в котором будут извинения за мою ошибку. –

0

Если бы я был в вашей ситуации и хотел понять, что происходит, я запустил приложение под отладчиком с точкой останова в обработчике событий LostFocus. Вы могли бы также рассмотреть вопрос о добавлении TRY/поймать/бросок, который мог бы сделать это проще проверить, что исключение действительно бросают, и если это так, чтобы осмотреть его, прежде чем он проглотил:

void text_LostFocus(object sender, EventArgs e) 
{ 
    try 
    { 
     Value = Value > MaxValue ? MaxValue : Value; 
     Value = Value < MinValue ? MinValue : Value; 
    } 
    catch(Exception ex) 
    { 
     throw; 
    } 
} 
+0

это комментарий, маскирующийся как ответ –

+0

@PeterDuniho - На самом деле это должен быть ответ - научить человека ловить рыбу и все такое. – Joe