【问题标题】:Message=SelectedDate value is not validMessage=SelectedDate 值无效
【发布时间】:2012-08-20 08:19:05
【问题描述】:

我可能很累,但是为什么会抛出异常:

 this.SomeDatePicker.SelectedDate = DateTime.Now.Date;

同样的情况发生在:

 this.SomeDatePicker.SelectedDate = DateTime.Now;

错误信息是:

System.ArgumentOutOfRangeException was unhandled
  Message=SelectedDate value is not valid.
Parameter name: d
  Source=PresentationFramework
  ParamName=d
  StackTrace:
       at System.Windows.Controls.Calendar.OnSelectedDateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
       at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
       at System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
       at System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
       at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
       at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
       at System.Windows.Controls.DatePicker.CoerceSelectedDate(DependencyObject d, Object value)
       at System.Windows.DependencyObject.ProcessCoerceValue(DependencyProperty dp, PropertyMetadata metadata, EntryIndex& entryIndex, Int32& targetIndex, EffectiveValueEntry& newEntry, EffectiveValueEntry& oldEntry, Object& oldValue, Object baseValue, Object controlValue, CoerceValueCallback coerceValueCallback, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, Boolean skipBaseValueChecks)
       at System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, DependencyProperty dp, PropertyMetadata metadata, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType)
       at System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, Object value, PropertyMetadata metadata, Boolean coerceWithDeferredReference, Boolean coerceWithCurrentValue, OperationType operationType, Boolean isInternal)
       at System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
       ....

【问题讨论】:

  • 您确定日期时间格式吗?我的意思是如果 your DateTime.Now 对应于分配给控件的那个?
  • 你引导我找到答案:stackoverflow.com/a/12115476/20654

标签: c# wpf datepicker


【解决方案1】:

如果您设置的日期存在于BlackoutDates 中,则会引发该异常。

AddDaysInPast 方法应该等价于:

Add(new CalendarDateRange(DateTime.MinValue, DateTime.Today.AddDays(-1)));

所以除非当前时间在调用AddDaysInPastSelectedDate 分配之间发生变化,否则您不应该遇到您描述的问题。

在调试中获取 BlackoutDates 中存在的完整范围并使用该信息更新您的问题,您可以使用以下内容:

string ranges = string.Join(
    Environment.NewLine,
    DatePicker.BlackoutDates.Select(r => string.Concat(r.Start, "|", r.End)));

【讨论】:

  • 我做 :-o 我添加了 DatePicker.BlackoutDates.AddDaysInPast (或类似的东西)后续问题是,我如何重置日期?
  • “重置日期”是什么意思?
  • 我正在使用带有“中间”或“选择日期”选项的此窗口……如果用户选择了一个日期……那么我选择那个日期。如果用户选择“中间”,我应该将该日期重置为“今天”
  • 您正在使用 DataBinding?...您的 DataContext 是否有可以将 DatePicker 的 SelectedDate 绑定到的 DateTime 属性? (例如
  • @OscarRyz 你是如何在 XAML 中设置中断日期的?我很好奇 AddDaysInPast 是否有问题。我会在我的 ViewModel(即 DataContext)“昨天”和“SelectedDate”上保留两个属性。 XAML 中的 BlackoutDates 设置为 FromDate="1/1/0001" 到 ToDate="Yesterday"。每当用户单击“立即”时,设置 SelectedDate = DateTime.Today。尚未对其进行测试,但我认为这是可行的。
【解决方案2】:

如果 DateTime.Now 超出 DisplayDateStart 和 DisplayDateEnd 定义的范围或包含在 BlackoutDates 中,则抛出异常。

【讨论】:

  • 至少在 .NET 4.0 设置中,SelectedDate 会根据需要自动调整 DisplayDateStartDisplayDateEnd,因此在这种情况下不会引发异常。
  • @JoãoAngelo,即使您明确设置了它们?
  • 是的,我用一个小样本确认,DisplayStartDate 已调整为我设置的日期,因为它早于之前的明确开始日期。
  • MSFT 应该随后更新 SelectedDate 的 MSDN 页面。这让我不相信。
  • 确实,我刚刚提供了有关该问题的反馈,希望他们能尽快解决。
【解决方案3】:

看:

ArgumentOutOfRangeException: 指定的日期不在 DisplayDateStart 和 DisplayDateEnd 定义的范围内,或者指定的日期在 BlackoutDates 集合中。

字体:http://msdn.microsoft.com/pt-br/library/system.windows.controls.datepicker.selecteddate.aspx

查看例外情况!

您需要日期和时间还是只需要日期?

DateTime.Now.ToString("yyyy-MM-dd"); // only date

DateTime.Now.ToString("yyyy-MM-dd hh:mm"); // date and hour

【讨论】:

  • 对于给定的用例,我需要将 DatePicker 日期设置为今天(用户选择按钮/标签之类的东西:“今天”,并且控件应该标有今天的日期
【解决方案4】:

谢谢 João Angelo、Ryan 的回答和 Ascension 的回答,我可以得到想要的结果:

if ( IsInmediate ) 
{
     SomeDatePicker.BlackoutDate.Clear();
     SomeDatePicker.SelectedDate = DateTime.Now;
     SomeDatePicker.BlackoutDate.AddDatesInPast();
}  

【讨论】:

    猜你喜欢
    • 2022-07-23
    • 2021-02-06
    • 2012-05-17
    • 1970-01-01
    • 2022-07-27
    • 2011-04-06
    • 1970-01-01
    • 2018-01-31
    • 2020-06-10
    相关资源
    最近更新 更多