【问题标题】:Syntax to extract DataGridViewCell value without conversion无需转换即可提取 DataGridViewCell 值的语法
【发布时间】:2016-07-07 03:35:49
【问题描述】:

我知道我可以做到:

Dim Amount As Double = CDbl(DGVRow.Cells("Amount").Value)

但我的 DGV 单元已经是 Double,所以我无需转换即可获得他的价值。

我已经尝试了下面的代码(但它不是正确的语法)

Dim Amount As Double = DGVRow.Cells.OfType(Of Double)("Amount").Value

【问题讨论】:

  • 由于列/单元格需要能够包含任何内容,因此它返回Object,这意味着您的值被装箱。如果您有数据源,您可以做很多您要求的事情:Dim d = dt.Rows(n).Field(Of Double)("Amount")。仍然有一个转换,只是一种不同的类型。不过,对于货币类型值来说,十进制会是更好的选择
  • @Plutonix 否。在这种情况下,我没有将数据表设置为源。我选择'Double'是因为我必须使用'Double'进行计算,而且我不需要极高的精度。无论如何,感谢您的宝贵提示;)
  • 特别是如果是钱并且有计算,Decimal是更好的选择。它可以防止舍入错误 - 请参阅 stackoverflow.com/q/1165761stackoverflow.com/q/890100

标签: vb.net datagridview


【解决方案1】:

如果你知道它总是包含一个 Double,你应该使用DirectCast

Dim Amount As Double = DirectCast(DGVRow.Cells("Amount").Value, Double)

这些都会产生 Double 类型的结果变量

Dim value As Object
value = 1.23#
Dim resultDC = DirectCast(value, Double)
Dim resultCT = CType(value, Double)
Dim resultCDBL = CDbl(value)

但幕后发生了不同的事情。 DirectCast 是最直接的。

查看这篇帖子Difference between DirectCast() and CType() in VB.NET,其中详细介绍了 VB.net 中转换方法之间的区别。还有这个VB CStr, CDate, CBool, etc. vs. DirectCast for casting without conversion

基本上,当您知道您的 Object 包含您期望的类型时,首选 DirectCast,因此不需要转换。它会比其他选项更快。

【讨论】:

    【解决方案2】:

    如果您确定该单元格包含Double 类型的值,请使用DirectCast

    Dim Amount As Double = DirectCast(DGVRow.Cells("Amount").Value, Double)
    

    其他方式将直接使用有界数据源的值,正如 @Plutonix 在 cmets 中解释的那样

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-05
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 2017-03-25
      相关资源
      最近更新 更多