2013-05-06 7 views
2

Я совершенно новичок в WPF и C# поэтому не обвиняйте меня в том, что я задал этот вопрос, возможно, глупый вопрос.Разница между "DateTime?" и "DateTime". (пытаюсь получить значение от datepicker)

У меня есть приложение WPF с двумя datepickers. Я хочу получить DateTime из них, когда он изменится, и использовать его в качестве моей переменной для некоторых других вещей в приложении. Таким образом, у меня есть для каждого из них что-то вроде этого (метод был автоматически генерируемой VS):

private void datePicker1_SelectedDateChanged(object sender, SelectionChangedEventArgs e) 
     { 
      date1 = datePicker1.SelectedDate; 
     } 

, но проблема в том, что дата в DatePicker является формат DateTime? нет DateTime, и я действительно не знаю, что означает этот знак вопроса, и почему он там. Я пробовал некоторые исследования, но не нашел ничего, что могло бы помочь мне. Если вы видите лучший способ получить дату с этого datepicker, вы также можете мне помочь с этим. Мне просто нужно это в моем коде xaml.cs, но не в xaml, и я не использую привязки, потому что я не уверен, работает ли он в этом случае.

Спасибо за любой ответ.

Edit: Я хотел бы добавить информацию о том, что он показывает мне эту ошибку:

Cannot implicitly convert type 'System.DateTime?' to 'System.DateTime'. An explicit conversion exists (are you missing a cast?)

ответ

13

DateTime с ? является Nullable DateTime, он может содержать нулевые значения. В вашем случае вы можете сделать:

private void datePicker1_SelectedDateChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if(datePicker1.SelectedDate.HasValue) 
     date1 = datePicker1.SelectedDate.Value; 
} 

Nullable<T> C#

In C# and Visual Basic, you mark a value type as nullable by using the ? notation after the value type. For example, int? in C# or Integer? in Visual Basic declares an integer value type that can be assigned null.

+0

Странно .. Я добавлял туда значение., но он не работал без if ... Well thx :) –

+1

@goodfriend, приветствую вас, да, это странно, он должен показывать работу только с «Value», но ее хорошо проверить на 'HasValue' – Habib

0

обнуляемого DateTime может быть пустым.

Само устройство DateTime не предоставляет нулевой вариант. Но тип NULL DateTime? позволяет присвоить нулевой литерал для типа DateTime. Он обеспечивает еще один уровень косвенности в объектной модели.

Program that uses null DateTime struct: C#

using System; 

class Program 
{ 
    static void Main() 
    { 
    // 
    // Declare a nullable DateTime instance and assign to null. 
    // ... Change the DateTime and use the Test method (below). 
    // 
    DateTime? value = null; 
    Test(value); 
    value = DateTime.Now; 
    Test(value); 
    value = DateTime.Now.AddDays(1); 
    Test(value); 
    // 
    // You can use the GetValueOrDefault method on nulls. 
    // 
    value = null; 
    Console.WriteLine(value.GetValueOrDefault()); 
    } 

    static void Test(DateTime? value) 
    { 
    // 
    // This method uses the HasValue property. 
    // ... If there is no value, the number zero is written. 
    // 
    if (value.HasValue) 
    { 
     Console.WriteLine(value.Value); 
    } 
    else 
    { 
     Console.WriteLine(0); 
    } 
    } 
} 

Выход

0 
9/29/2009 9:56:21 AM 
9/30/2009 9:56:21 AM 
1/1/0001 12:00:00 AM 

Первоначально найдено Here

удачи!

0

Вы не можете создать DateTime без какого-либо значения (то есть, null). Он всегда будет иметь значение по умолчанию (DateTime.MinValue).

DateTime?, с другой стороны, является своим родом обертки вокруг DateTime, что позволяет сохранить его неопределенных. Это может быть очень полезно, например, если вы хотите, чтобы пользователь оставил одно из полей даты пустым (дата не выбрана = Null).

Помните, что вам нужно использовать DateTime? как тип параметра любых методов, которые должны выполнять работу, связанную с этим. Если вы полагаетесь на другие библиотеки или должны передавать эти данные другим компонентам и т. Д., То иногда вы можете столкнуться с неловкими ситуациями.

Типичный вызов/решение:
"Я использую DateTime? в компоненте X, который разговаривает с компонентом Y, который использует DateTime - я должен переписать Y для обработки DateTime?, или должны Я переведу любой DateTime? -объект со значением Null в DateTime -объект со значением DateTime.MinValue для представления невыбранных/недействительных дат? Или, может быть, я должен просто дать ему исключение в Y ...? "

Просто что-то знать и думать о том, когда работа с DateTime? ..

0

обнуляемого DateTime может быть пустым. Сама DateTime структура не обеспечивает нулевой вариант. Но„DateTime?“Обнуляемым type позволяет присваивать нулевой литерал типу DateTime. Он обеспечивает еще один уровень косвенности.

Смежные вопросы