【问题标题】:date difference using datepicker in wpf在 wpf 中使用 datepicker 的日期差异
【发布时间】:2012-07-24 21:23:28
【问题描述】:

我正在尝试计算两个日期之间的天数并将结果显示在文本块中,我正在使用 wpf。但是我得到一个可为空的对象必须在第一行有一个值:S

    private void button20_Click(object sender, RoutedEventArgs e)
    {
        DateTime start = datePicker1.DisplayDateStart.Value.Date;
        DateTime finish = datePicker2.DisplayDateStart.Value.Date;
        TimeSpan difference = start.Subtract(finish);
        textBlock10.Text = Convert.ToString(difference);
    }

【问题讨论】:

  • 我想你想要finish.Subtract(start),不是吗?

标签: c# wpf datetime


【解决方案1】:

正如错误消息所暗示的,DisplayDateStart 是一个可为空的属性,这意味着它可以(并且,默认情况下,确实)没有值。您必须处理这种情况才能产生合理的结果。

也就是说,DisplayDateStart 属性指的是 DatePicker 日历中显示的最早日期,而不是用户选择的日期:为此,您需要 SelectedDate 属性,它也可以为空。

您可以通过多种方式处理 NULL 值:在 TextBlock 中不显示任何内容、显示“N/A”或其他默认值等。下面是一个示例:

private void button20_Click(object sender, RoutedEventArgs e)
{
    // This block sets the TextBlock to a sensible default if dates haven't been picked
    if(!datePicker1.SelectedDate.HasValue || !datePicker2.SelectedDate.HasValue)
    {
        textBlock10.Text = "Select dates";
        return;
    }

    // Because the nullable SelectedDate properties must have a value to reach this point, 
    // we can safely reference them - otherwise, these statements throw, as you've discovered.
    DateTime start = datePicker1.SelectedDate.Value.Date;
    DateTime finish = datePicker2.SelectedDate.Value.Date;
    TimeSpan difference = finish.Subtract(start);
    textBlock10.Text = difference.TotalDays.ToString();
}

【讨论】:

  • SelectedDateDisplayDate 有什么区别?后者不可为空,所以我认为它看起来更易于使用。
  • 根据documentationDisplayDate“如果 SelectedDate 为空,则允许开发人员指定要显示的日期。”它默认为今天的日期,我认为它不一定代表用户选择的日期。
  • 来自 MSDN:DisplayDate 属性会影响 DatePicker 的日历。
  • Convert.ToString(difference.TotalDays); 是更好的输出。
  • 啊,应该已经测试了格式,并使用了 TotalDays 属性(但我还是更喜欢直接调用对象的 ToString() 方法)。至于DisplayDate:我可以确认它不会随着用户选择的日期更新。如果未设置,则保留今天的日期。
【解决方案2】:

如果您想获取所选日期,则说明您使用了错误的属性。 DisplayDateStartDisplayDateEnd 限制了可能的选择。它们可以为空,因为应该可以不受任何限制地创建日期选择器。更改您的开始和结束分配以改用DisplayDate 属性:

DateTime start = datePicker1.DisplayDate.Date;
DateTime finish = datePicker2.DisplayDate.Date;

您还应该考虑重命名日期选择器。拥有名为datePicker1datePicker2 的控件通常很难记住。 datePickerStartdatePickerEnd 呢?

(免责声明:我知道 WPF 控件通常没有名称,因为它们是数据绑定的,因此名称无关紧要,但在这种情况下,它们是显式访问的并且应该具有正确的名称)。

【讨论】:

  • 我最初尝试过这个,但它输出 00:00:00 到文本块?
  • 这是因为默认情况下日期选择器将显示今天的日期。今天和今天之间没有什么区别。零 TimeSpan 将被格式化为 00:00:00。您必须调用 difference.Format("d") 而不是 Convert.ToString(difference) 才能将其输出为天数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
相关资源
最近更新 更多