我正在制作一个程序而且我一直收到错误Index was outside the bounds of the array
但我无法弄清楚原因。我尝试了设置2D数组的所有不同版本。
以下是我现在设置的方法
Dim dataArray(,) As Array = New Array(,) {{}}
这是我的循环
Dim x As Integer
Dim DT As DataTable
Dim TA As New DSOldOrdersTableAdapters.TA
DT = getOldOrders()
For x = 0 To DT.Rows.Count - 1
dataArray(0, x) = DT.Rows(x).Item("SO")
dataArray(1, x) = (DT.Rows(x).Item("Customer"))
dataArray(2, x) = (DT.Rows(x).Item("ShipBy"))
Next
答案 0 :(得分:3)
您正在声明一个长度为0的数组。这意味着它将无法保存任何数据。所有索引都将超出范围。随着项目的添加,数组不会自动增长。因此,数组通常只应在数组大小固定(不变)的情况下使用。例如:
Dim dataArray(2, 2) As Object ' Creates a 3x3 array of objects
如果您希望它在添加项目时自动增长,您通常需要使用List(Of T)
而不是数组。例如:
Public Class MyItem
Public Property SO As Object
Public Property Customer As Object
Public Property ShipBy As Object
End Class
' ...
Dim dataList As New List(Of MyItem)()
' ...
Dim item As New MyItem()
item.SO = DT.Rows(x).Item("SO")
item.Customer = DT.Rows(x).Item("Customer")
item.ShipBy = DT.Rows(x).Item("ShipBy")
dataList.Add(item)
' ...
Label1.Text = dataList(1).SO
或者,如果您坚持使用数组来存储每个项目,您可以列出一维数组,如下所示:
Dim dataList As New List(Of Object())()
' ...
dataList.Add(
{
DT.Rows(x).Item("SO"),
DT.Rows(x).Item("Customer"),
DT.Rows(x).Item("ShipBy")
})
' ...
Label1.Text = dataList(1)(0)
答案 1 :(得分:1)
正如@Steven Doggart所说(并且在答案中打了我一分钟)你正在宣布一个阵列,但是你没有给出尺寸长度。您有两种选择:
在您的情况下,一个解决方案可能如下所示:
Dim dataArray(,) As Array = New Array(3, DT.Rows.Count) {{}}
或者像这样:
Dim dataArray(,) As Array = New Array(,) {{}}
Redim dataArray(3, DT.Rows.Count)
Dim x As Integer
Dim DT As DataTable
Dim TA As New DSOldOrdersTableAdapters.TA
DT = getOldOrders()
For x = 0 To DT.Rows.Count - 1
dataArray(0, x) = DT.Rows(x).Item("SO")
dataArray(1, x) = (DT.Rows(x).Item("Customer"))
dataArray(2, x) = (DT.Rows(x).Item("ShipBy"))
Next
看看这个MSDN Article - How to: Initialize an Array variable in VB.NET。
答案 2 :(得分:1)
Dim dataArray(,) As Array = New Array(,) {{}}
这会创建一个Array
的二维数组,即一个二维数组,其中每个元素都是Array
。然后将其初始化为包含单个空Array
元素的数组。我希望这不是你想要的。
由于您从未在代码中的任何位置ReDim
更改其尺寸,因此它仍然是一个二维数组,其第一个维度为长度1,第二个维度为长度为零。
当您尝试运行
时 dataArray(0, x) = DT.Rows(x).Item("SO")
数组的第二维长度为零,因此无法保存值。因此,您会得到“索引超出范围”的异常。如果没有发生这种情况,您可能会得到另一个例外,因为DT.Rows(x).Item("SO")
可能不是Array
。
将数据保留在DataTable中可能更容易,并在需要时从中读取数据。否则,我认为你的意图是做类似的事情:
Dim dataArray(0 To 3, -1) As Object 'Temporarily create a 2D Object array
'...load the DataTable
ReDim dataArray(0 to 3, 0 To DT.Rows.Count - 1) 'Redimension the array to the proper size.
'...rest of code