使用Binding.Parse避免使用System.FormatException

时间:2017-06-06 12:18:10

标签: c# winforms data-binding textbox

我有model3绑定到TextBox类型的属性。因为我希望文本字段中的值以两个小数点显示(例如3.15),所以我已按如下方式实现了绑定:

decimal

Binding bindDecimal = new Binding("Text", viewModel, "myDecimal"); bindDecimal.Format += FormatDecimal; bindDecimal.Parse += ParseDecimal; 函数,所以有趣的部分是.Format函数,它的实现如下:

.Parse

哪个有效,只要价值是合法的。如果我开始使用字母或(更现实地)将字段留空,则返回 System.FormatException ,因为它无法将值转换为小数。问题的一个转折点是,当private void ParseDecimal(object sender, ConvertEventArgs e) { if (e.DesiredType != typeof(decimal)) return; e.Value = Decimal.Parse(e.Value.ToString(), NumberStyles.Number); } 为空时,如果关闭窗体窗口也会出现这种情况。

  

避免此异常的最佳方法是什么?

此外,如果它有任何区别,这里是TextBox函数:

.Format

2 个答案:

答案 0 :(得分:1)

您应该使用decimal.TryParse()

private void ParseDecimal(object sender, ConvertEventArgs e)
{
    if (e.DesiredType != typeof(decimal)) return;

    Decimal bob;

    Decimal.TryParse(e.Value.ToString(), NumberStyles.Number, new CultureInfo.CurrentCulture, out bob)

    // set e.Value to bob regardless of whether a true of false is returned
    // if true bob holds the parsed value.
    // if false bob holds the default value for decimal (zero), which you probably want to use
    e.Value = bob;

 }

答案 1 :(得分:1)

private void ParseDecimal(object sender, ConvertEventArgs e)
{
    if (e.DesiredType != typeof(decimal)) return;

    Decimal bob;

    if (Decimal.TryParse(e.Value.ToString(), NumberStyles.Number, new CultureInfo.CurrentCulture, out bob);
    {
        e.Value = bob;
    }
}