2015-09-28 72 views
1
Dim dtIzvrsenja datetime 
Private Sub chkDate_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkDate.CheckedChanged 
     If Me.chkDate.Checked Then 
      Me.dtpDate.CustomFormat = "dd.MM.yyyy" 
      Me.dtpDate.Enabled = True 
      dtIzvrsenja = dtpdate.value 
     Else 
      Me.dtpDate.CustomFormat = " " 
      Me.dtpDate.Enabled = False 
      dtIzvrsenja = Nothing 
     End If 
    End Sub 

如果未检查到chk,是否有任何方法将dtIzvrsenja的值设置为null?将日期变量设置为空

使用其他提到的方式进行编辑。

{ “可空对象必须有一个值。”}

Dim dtIzvrsenja2 As DateTime? = Nothing 
      dtIzvrsenja = dtIzvrsenja2 

回答

0

为了支持这一点,您需要使用通用的Nullable(Of Date)类型,而不仅仅是DateDateTime类型的VB别名)。通常,只有参考类型变量(Class类型变量)支持空值。由于Date值类型变量(Structure),因此它不支持空值。 Nullable(Of T)允许您包装任何值类型并向该类型添加对空值的支持。

在VB(以及C#,顺便说一下)中,任何类型名称后面的问号都是使类型为空的简写形式。所以,Date?相当于Nullable(Of Date)。下面是使用nullables您的示例代码:

Dim dtIzvrsenja As Date? 
Private Sub chkDate_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkDate.CheckedChanged 
    If Me.chkDate.Checked Then 
     Me.dtpDate.CustomFormat = "dd.MM.yyyy" 
     Me.dtpDate.Enabled = True 
     dtIzvrsenja = dtpdate.value 
    Else 
     Me.dtpDate.CustomFormat = " " 
     Me.dtpDate.Enabled = False 
     dtIzvrsenja = Nothing 
    End If 
End Sub 

然而,令人困惑的事情有关Nullable(Of T)的是,它本身不是一个引用类型Nullable(Of T)是一个值类型。因此,即使Nullable(Of Date)变量不能在传统意义上设置为空。 Nullable(Of T)的作用是添加一个HasValue As Boolean属性,该属性允许您检查值是否为空。因此,当你去读取变量的值时,而不是首先检查变量Is Nothing,你需要改为检查它是否为HasValue属性为真。例如:

If dtIzvrsenja.HasValue Then 
    Dim dtIzvrsenja2 As Date = dtIzvrsenja.Value 
    ' ... 
End If 

如果你真的想治疗Date类型作为一个真正的引用类型,那么你可以通过声明变量As Object这样做。 Object变量总是参考变量,所以当设置为Nothing时,它们确实被设置为null。当您将一个Object变量设置为值类型值时,如Date,它将的值。当您读取它的值并将其转换回Date时,它将经历一个称为的拆箱的过程。但是,这个装箱/拆箱过程确实会增加一些开销。此外,另一个缺点是编译时会跳过使用Object变量的代码的类型检查。这意味着,如果您不小心,可能会在运行时得到一些异常,如果变量引用的对象类型与您期望的不同。你可以通过声明自己的类避免类型检查的问题:

Public Class DateReference 
    Public Property Value As Date 
End Class 

或者:

Public Class Reference(Of T) 
    Public Property Value As T 
End Class 

然而,这似乎是愚蠢的。 Nullable(Of T)已经达到了这个目的,所以除非你真的需要把它作为参考类型,否则我建议你花点时间去熟悉它的标准方法。

作为一个侧面说明,另一个进一步导致混淆在这一领域的复杂化是VB的Nothing关键字不严格意味着空。它只是意味着任何类型的失窃价值。因此,对于Integer,Nothing等于零值。对于Date,这意味着Date.MinValue等。

0

使用Nullable

Dim nullableDateValue As New Nullable(Of Date) = Nothing 
+0

但是,如果用户选中并取消选中该复选框,该怎么办。我无法再声明 - – myString

0

您还可以使用问号(可空)符,虽然这现在可能过时了...

Dim dtIzvrsenja As DateTime? = Nothing 
+0

但是,如果用户选中并取消选中该复选框,该怎么办?我不能再次声明 – myString

+0

当然你可以想出一种测试方法吗?最明显的方法是让你自己的结构来处理日期和布尔值,如果这是你想要的,那么你甚至不需要存储任何东西。 – Paul