3

我试图计算两个日期之间有多少天并将结果显示在文本块中,我正在使用 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);
    }
4

2 回答 2

3

正如错误消息所暗示的那样,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();
}
于 2012-07-24T21:29:36.747 回答
1

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

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

您还应该考虑重命名日期选择器。有控件命名datePicker1并且datePicker2通常很难记住。datePickerStart和怎么样datePickerEnd

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

于 2012-07-24T21:27:35.517 回答