【问题标题】:Difference between "DateTime?" and "DateTime". (trying to get value from datepicker)“日期时间?”之间的区别和“日期时间”。 (试图从日期选择器中获取价值)
【发布时间】:2013-05-06 10:55:24
【问题描述】:

我对 WPFC# 还是很陌生,所以不要怪我问这个可能很愚蠢的问题。

我的 WPF 应用程序带有两个 datepickers。我想在 DateTime 更改时从中取出 DateTime,并将其用作应用程序中其他一些东西的变量。所以我对他们每个人都有这样的东西(方法是由VS自动生成的):

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

但问题是日期选择器中的日期格式是 DateTime? 而不是 DateTime 我真的不知道那个问号是什么意思以及为什么有没有。我尝试了一些研究,但没有找到任何对我有帮助的东西。如果您看到从该日期选择器获取日期的更好方法,您也可以帮助我。我只需要在我的 xaml.cs 代码中而不是在 xaml 中使用它,而且我并不真正喜欢使用绑定,因为我不确定它在这种情况下是否符合我的需要。

感谢您的任何回答。

编辑:我想添加它向我显示此错误的信息:

不能隐式转换类型“System.DateTime?”到 '系统。日期时间'。存在显式转换(您是否缺少 演员?)

【问题讨论】:

    标签: c# wpf visual-studio-2010 datetime datetimepicker


    【解决方案1】:

    ? 的日期时间是Nullable 日期时间,它可以保存空值。对于您的情况,您可以这样做:

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

    Nullable<T> C#

    在 C# 和 Visual Basic 中,您可以使用 ?值类型后的符号。例如,int?用 C# 还是整数? 在 Visual Basic 中声明了一个可以赋值的整数值类型 空。

    【讨论】:

    • 奇怪..我在那里添加了 .Value 但如果没有 if... 嗯 thx :)
    • @goodfriend,不客气,是的,这很奇怪,它应该只显示 Value,但检查 HasValue 很好
    【解决方案2】:

    可为空的 DateTime 可以为空。

    DateTime 结构本身不提供空选项。但是DateTime? 可空类型允许您将空文字分配给DateTime 类型。它在对象模型中提供了另一层间接性。

    使用空 DateTime 结构的程序: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

    祝你好运!

    【讨论】:

      【解决方案3】:

      您不能创建没有任何值(即空值)的DateTime。它将始终具有默认值 (DateTime.MinValue)。

      另一方面,DateTime?DateTime 的一种包装,它允许您保留它未定义。这可能非常有用,例如,如果您想让用户将日期字段之一留空(未选择日期 = Null)。

      请记住,您需要使用DateTime? 作为任何需要执行与此相关工作的方法的参数类型。如果您依赖其他库,或者必须将此数据传递给其他组件等,那么您有时可能会遇到尴尬的情况。

      典型的挑战/决定:
      "我在组件 X 中使用 DateTime?,它与组件 Y 对话,组件 Y 使用 DateTime - 我应该重写 Y 来处理DateTime?,或者我应该将任何值为NullDateTime?-object 转换为值为DateTime.MinValueDateTime-object 以表示未选择/无效的日期?或者我应该就让它在Y...中抛出异常吗?"

      只是在使用DateTime?.. 时需要注意和思考的事情。

      【讨论】:

        【解决方案4】:

        可为空的 DateTime 可以为空。 DateTime 结构本身不提供 null 选项。但是“日期时间?”可空类型允许您将空文字分配给 DateTime 类型。它提供了另一个层次的间接性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-11
          • 2021-08-05
          相关资源
          最近更新 更多