3

2 つの日付の間にある日数を計算し、結果をテキストブロックに表示しようとしています。wpf を使用しています。ただし、null 許容オブジェクトには最初の行に値が必要です: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

エラー メッセージが示すように、DisplayDateStartnull 許容のプロパティです。適切な結果を得るには、この条件を処理する必要があります。

つまり、このプロパティは、ユーザーが選択した日付ではなく、DatePicker のカレンダーに表示される最も早い日付を参照します。そのためには、null 許容でもDisplayDateStartあるプロパティが必要です。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

選択した日付を取得したい場合は、間違ったプロパティを使用しています。DisplayDateStart可能な選択肢をDisplayDateEnd制限します。制限なしで日付ピッカーを作成できるはずなので、それらは null 可能です。DisplayDate代わりにプロパティを使用するように開始と終了の割り当てを変更します。

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

日付ピッカーの名前を変更することも検討する必要があります。コントロールに名前を付けるとdatePicker1datePicker2通常は覚えにくいです。datePickerStartとはどうdatePickerEndですか?

(免責事項:WPFコントロールは通常、データバインドされているため名前は問題にならないため、名前を取得しないことを知っていますが、この場合は明示的にアクセスされ、適切な名前が必要です)。

于 2012-07-24T21:27:35.517 に答える