使用可空数据类型的属性分配文本框文本

时间:2018-03-21 11:53:22

标签: vb.net controls nullable

出于某种原因,当我尝试将可为空的十进制数据类型的属性分配给文本框文本时,我遇到了错误。

例如,我有这个产品类:

Public Class Product
    Public Property ProductId As Integer
    Public Property ProductName As String
    Public Property [Variant] As String
    Public Property PackSize As Decimal?
End Class

并且Product的实例的[Variant]值为NothingPackSize值为Nothing

当我尝试将[Variant]值分配给如下文本框时:

VariantTextBox.Text = mProduct.[Variant]

它工作正常。

但是当我尝试将PackSize值分配给这样的文本框时:

PackSizeTextBox.Text = mProduct.PackSize

它会抛出此消息的异常:

  

Nullable对象必须有值。

我不明白为什么会发生这种情况:

PackSizeTextBox.Text = Nothing

没有任何错误。

我尝试过其他方式:

PackSizeTextBox.Text = If(mProduct.PackSize, Nothing)
PackSizeTextBox.Text = If(mProduct.PackSize IsNot Nothing, mProduct.PackSize, Nothing)
PackSizeTextBox.Text = If(mProduct.PackSize.HasValue, mProduct.PackSize, Nothing)

但他们都会犯同样的错误。

然而,当我稍微调整它们时:

PackSizeTextBox.Text = If(mProduct.PackSize, "")
PackSizeTextBox.Text = If(mProduct.PackSize IsNot Nothing, mProduct.PackSize, "")
PackSizeTextBox.Text = If(mProduct.PackSize.HasValue, mProduct.PackSize, "")
他们奇怪地工作得很好。

最终,我真的不喜欢做长If语句只是为了获得可以为空的数据类型属性的值,所以我就这样做了:

PackSizeTextBox.Text = mProduct.PackSize?.ToString

我希望有人可以向我解释我遇到的错误。 谢谢!

1 个答案:

答案 0 :(得分:6)

Text的{​​{1}}属性类型为TextBox,因此唯一可分配给它的是String。如果您有String并指定了Option Strict Off以外的内容,则系统会隐式调用String。这意味着:

ToString

与此基本相同:

PackSizeTextBox.Text = mProduct.PackSize

并且显而易见的是,当PackSizeTextBox.Text = mProduct.PackSize.Value.ToString() mProduct.PackSize时,您会收到错误消息。

所有这些:

Nothing

无法工作,因为PackSizeTextBox.Text = If(mProduct.PackSize, Nothing) PackSizeTextBox.Text = If(mProduct.PackSize IsNot Nothing, mProduct.PackSize, Nothing) PackSizeTextBox.Text = If(mProduct.PackSize.HasValue, mProduct.PackSize, Nothing) 运算符基本上是通用的,因为返回的两个值必须是相同的类型。因此,您的所有If返回值都会隐式转换为Nothing值,最终必须以完全相同的方式隐式转换为Decimal?同样的结果。

您最终获得的代码:

String

是正确的代码,因为您明确地将非PackSizeTextBox.Text = mProduct.PackSize?.ToString 的内容转换为String,以便将其分配给String属性。这正是你应该做的,以及如果你有String,你绝对应该做的事情。

默认情况下,Option Strict On的任何VB.NET开发人员都是初学者,不知道任何更好或更糟的开发人员。现在在项目属性中以及在IDE选项中将其Option Strict Off转为,以便在将来的所有项目中默认为On。当你特别需要后期绑定时,你应该只将它变成On,即使这样,也只能在只包含需要后期绑定的特定代码的部分类文件中。{/ p>