VB.NET中如何为可空数据类型的属性分配文本框中的文本?

2026-05-08 13:073阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计822个文字,预计阅读时间需要4分钟。

VB.NET中如何为可空数据类型的属性分配文本框中的文本?

由于原文较长,以下是对其进行简化和改写的版本:

由于某种原因,当我尝试将十进制数据类型的属性分配给文本框文本时,遇到了错误。例如,我有一个名为Product的类:Public Class Product Public Property ProductId As Integer Public Property ProductName As String End Class

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

例如,我有这个Product类:

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]值为Nothing,PackSize值为Nothing.

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

VariantTextBox.Text = mProduct.[Variant]

它工作正常.

但是当我尝试将PackSize值分配给文本框时,如下所示:

PackSizeTextBox.Text = mProduct.PackSize

它会抛出此消息的异常:

Nullable object must have a value.

我不明白为什么当我这样做时会发生这种情况:

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)

但他们都抛出同样的错误.

但是,当我稍微调整它们时:

VB.NET中如何为可空数据类型的属性分配文本框中的文本?

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

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

TextBox的Text属性是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你必须要做的事情,你绝对应该这样做.

默认情况下,任何具有Option Strict Off的VB.NET开发人员都是初学者,他们不了解任何更好或更糟的开发人员.现在在项目属性和IDE选项中打开它,以便在将来的所有项目中默认为On.您应该只在特别需要后期绑定时将其关闭,即使这样,也只能在仅包含需要后期绑定的特定代码的部分类文件中将其关闭.

标签:属性分配

本文共计822个文字,预计阅读时间需要4分钟。

VB.NET中如何为可空数据类型的属性分配文本框中的文本?

由于原文较长,以下是对其进行简化和改写的版本:

由于某种原因,当我尝试将十进制数据类型的属性分配给文本框文本时,遇到了错误。例如,我有一个名为Product的类:Public Class Product Public Property ProductId As Integer Public Property ProductName As String End Class

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

例如,我有这个Product类:

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]值为Nothing,PackSize值为Nothing.

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

VariantTextBox.Text = mProduct.[Variant]

它工作正常.

但是当我尝试将PackSize值分配给文本框时,如下所示:

PackSizeTextBox.Text = mProduct.PackSize

它会抛出此消息的异常:

Nullable object must have a value.

我不明白为什么当我这样做时会发生这种情况:

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)

但他们都抛出同样的错误.

但是,当我稍微调整它们时:

VB.NET中如何为可空数据类型的属性分配文本框中的文本?

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

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

TextBox的Text属性是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你必须要做的事情,你绝对应该这样做.

默认情况下,任何具有Option Strict Off的VB.NET开发人员都是初学者,他们不了解任何更好或更糟的开发人员.现在在项目属性和IDE选项中打开它,以便在将来的所有项目中默认为On.您应该只在特别需要后期绑定时将其关闭,即使这样,也只能在仅包含需要后期绑定的特定代码的部分类文件中将其关闭.

标签:属性分配