我有一个包含TextBox的自定义控件。自定义类有3个属性,MinValue,MaxValue和Value,定义如下:
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
到{{1} }?
答案 0 :(得分:1)
首先,C#中有不同的整数数据类型。
e.g。
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
因使用32位内存而无法获得更大范围的技术。
使用该类型的无符号版本会将范围仅移至正值,因此如果您不需要负值,还可以查看UInt32
。
要实际增加范围,您唯一的选择是使用Int64
数据类型。
另见:https://msdn.microsoft.com/en-US/en-en/library/exx3b86w.aspx
(int
是Int32
的别名,long
的{{1}}
其次,由于您既没有Int64
块也没有使用try-catch
,因此应该有一个未处理的TryParse
。如果没有任何例外,这有点奇怪。你确定,那不在System.OverflowException
区块内吗?
无论如何,我建议您使用try-catch
代替TryParse
并相应地处理错误。
答案 1 :(得分:0)
如果我遇到你的情况,并想了解发生了什么,我会在调试器下运行应用程序,在LostFocus
事件处理程序中有一个断点。你还可以考虑添加一个try / catch / throw,这可以更容易地验证是否确实抛出了异常,如果是这样的话,在它被吞下之前检查它:
void text_LostFocus(object sender, EventArgs e)
{
try
{
Value = Value > MaxValue ? MaxValue : Value;
Value = Value < MinValue ? MinValue : Value;
}
catch(Exception ex)
{
throw;
}
}
答案 2 :(得分:-1)
好的,我发现了这个问题:
红色圆圈内的复选框取消选中。可能是我修复了我的IDE安装(VS Express 2012)。我最近安装了VS 2012 Professional,他们使用相同的选项,因为在Professional中检查它也在Express
中修复了它