【问题标题】:DatePicker System.FormatExceptionDatePicker System.FormatException
【发布时间】:2015-02-21 21:59:38
【问题描述】:

如果我在此 DatePicker 中输入了无效日期,例如
20001 年 1 月 1 日(输入键)
我得到以下异常

“System.FormatException”类型的第一次机会异常发生在 mscorlib.dll

附加信息:字符串未被识别为有效的日期时间。

但似乎这是由绑定引发的,我找不到处理它的方法。
在调试中,我在屏幕上看到上述内容

打开堆栈跟踪,它说错误是在 SearchItem.Date1 get 上引发的
但问题是在那种情况下实际上并没有调用 get

如果我输入一个有效的日期,例如 2000 年 1 月 1 日,我会看到集合并被调用。

如果我输入无效日期,则无需设置。

我输入无效日期并按输入或失去焦点只是恢复到前一个日期并且不会引发异常。如果之前的日期为空,则它恢复为空。

如果用户输入有效日期,这对我来说是一个关键问题 然后输入一个无效的日期,DatePicker 只是恢复到最后一个有效日期。所以用户不知道日期没有改变。

问题是如何处理无效日期异常?

<DatePicker Width="140" DisplayDateStart="1/1/1990" DisplayDateEnd="12/31/2020" 
            SelectedDate="{Binding Path=Date1, Mode=TwoWay, ValidatesOnExceptions=True, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"/>

如果我拿出来

, ValidatesOnExceptions=True, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged  

没有任何变化

private DateTime? date1; 
public DateTime? Date1
{
    get
    {
        try
        {
            return date1;
        }
        catch (Exception ex)
        {
            return (DateTime?)null;
            throw;
        }
    }
    set
    {
        if (date1 != value)
        {
            date1 = value;
            NotifyPropertyChanged("Date1");    
        }
    }
}

【问题讨论】:

  • 这是DatePickerSystem.Windows.Controls.DatePicker吗?因为如果是的话,当我运行你的代码时不会抛出异常。
  • @Bahman_Aries 对我来说,错误的方向也不例外。我需要赶上一个无效的日期。

标签: wpf datepicker formatexception


【解决方案1】:

我能想到的一种方法是使用DateValidationError事件:

XAML:

<DatePicker Width="140" DisplayDateStart="1/1/1990" DisplayDateEnd="12/31/2020" 
            SelectedDate="{Binding Path=Date1, Mode=TwoWay, 
            ValidatesOnExceptions=True, ValidatesOnDataErrors=True, 
            UpdateSourceTrigger=PropertyChanged}"
            DateValidationError="DatePicker_DateValidationError" />

后面的代码:

private void DatePicker_DateValidationError(object sender, DatePickerDateValidationErrorEventArgs e)
{
    // throw FormatException
    e.ThrowException = true;

    //OR

    // handle the exception by showing message and clearing data
    MessageBox.Show(e.Exception.Message);
    ((DatePicker)sender).Text = null;
}

【讨论】:

  • 到目前为止这看起来不错。让我再做一些测试。谢谢。
猜你喜欢
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多