【问题标题】:Both the Row Number and Field Value Appear in Cell Values Pulled from DataTable行号和字段值都出现在从 DataTable 中提取的单元格值中
【发布时间】:2021-08-02 06:56:13
【问题描述】:

我使用各种数据源(Excel、Access 等)用来自多个文本和双字段的值填充了一个 DataTable (dt)。然后我从dt 填充了一个DataGridView,文本、整数和实数(双)列在DataGridView 中可见并且没有任何问题。

但是,在我的代码的一个区域中,我正在使用代码获取特定单元格的年龄值(第 6 列)

Dim myage As Integer = dt.rows(i)(j) 

第 0 行的 age 值为 19,因此在大多数情况下使用 myage = dt.rows(0)(6) 时,年龄显示为 19。但是,在我的应用程序的另一个区域(使用相同的dt 和获取年龄值的代码),年龄显示为0 19,其中0 是dt 的行号。如果我使用 dt.rows(1)(6) 获得第 1 行的年龄值,它会显示为 1 24

为什么 dt 在我的应用程序的一个区域只产生一个数值,而在我的应用程序的另一个区域产生行和年龄?

我不确定是否使用.row 是问题,我已经尝试过dt.rows(1).Field(Of Integer)(6) 并且它不会阻止出现行号。

由于我需要在我的应用程序的许多地方从dt 中提取单元格值,我该如何避免这种困境?

【问题讨论】:

  • 你所描述的根本不可能。 Field(Of Integer) 方法将返回 Integer 并且“0 19”和“1 24”不是 Integers。这意味着它必须是您对数据而不是数据本身所做的事情。根据您的描述,听起来您实际上还没有调试过代码,所以您甚至不应该在这里发布问题。如果您不知道如何使用 VS 调试器,请停止您正在做的事情并立即学习。然后,您需要在发布之前始终调试您的代码,并提供您从调试器获得的信息。
  • 我知道没有抛出异常,这证明您的列不包含您所暗示的数据。如果字段不包含Integer,则调用Field(Of Integer) 将引发异常,因此没有异常证明它确实如此。它还将返回一个Integer 值,因此它不可能返回您报告的值。这证明您没有向我们提供准确的信息,或者在您从DataTable 中获取数据后,问题是由您的代码造成的。

标签: vb.net datatable


【解决方案1】:

在添加数据表列时,将您的数据类型更改为整数,例如:dt.Columns.Add("Age", System.Type.GetType("System.Int32")) 然后尝试它会支持。

【讨论】:

  • @wrstks,你所说的没有任何意义。 DBNull 绝对不是 NothingDBNull 存在的真正原因是在创建 ADO.NET 时值类型不能没有值(它们现在可以通过可为空的值类型)。您绝对应该将每列的DataType 设置为它将包含的数据类型。这不会停止任何包含DBNull 的列。根据您在其他地方发布的内容,这对您的问题没有帮助,但这仍然是您应该做的。
  • 这是设置数据类型的不好方法。它比必要的更冗长,而且也容易出错,因为您使用String 来表示数据类型。仅当您必须从某个外部源获取数据类型为 String 时才这样做。如果您对类型进行硬编码,请始终使用数据类型,例如dt.Columns.Add("Age", GetType(Integer))。在这种情况下,您使用的是 GetType 关键字(它变成蓝色),而不是类的成员。因为您正在指定数据类型,所以编译器会防止您拼写错误。
  • 不,仍然荒谬。我理解您所说的关于数据类型等的内容,但这些都不能证明您将 Object 指定为列的数据类型是合理的。如果一个列应该存储Integers,那么它的DataType 应该是Integer,不管它是否可以为空。此外,DataRow 有自己的方法用于检查,例如xobject(i, j) = If(dt.Rows(i).IsNull(j), CObj(Nothing), dt.Rows(i)(j)).
猜你喜欢
  • 2018-05-30
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
相关资源
最近更新 更多