You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VB.NET中动态创建DataTable数组并解决声明及空引用报错问题

错误原因分析
  • 第一个报错Arrays cannot be declared with 'New':VB.NET 不支持在声明数组时直接对整个数组使用New关键字,数组仅用于定义存储结构,每个元素需要单独实例化。同时你当前将table声明为方法内的局部变量,方法执行完就会被销毁,后续按钮点击事件完全无法访问到这个数组,这也是隐含错误。
  • 第二个空引用报错:你仅声明了table(i)的类型是DataTable,但没有为这个位置的元素创建实际实例,直接调用Columns属性就会触发空对象引用异常。
修复代码

首先需要将table数组提升为全局变量,如果需要跨窗体访问,要声明为共享公共变量:

' 假设你在Form1中存储DataTable,需要跨窗体访问就加Public Shared
Public Class Form1
    ' 窗体级全局数组声明,不要写在方法内部
    Public Shared table As DataTable() = {} ' 初始化空数组
End Class

修改创建DataTable的方法:

Sub AddNewTable() 
    ' 先校验输入的是合法数字
    Dim i As Integer
    If Not Integer.TryParse(TextBox1.Text, i) OrElse i < 0 Then
        MessageBox.Show("请输入合法的非负整数序号")
        Exit Sub
    End If

    ' 如果数组长度不够,扩容保留已有数据
    If i >= table.Length Then
        ReDim Preserve table(i)
    End If

    ' 单独为对应序号的元素实例化DataTable
    table(i) = New DataTable()

    With table(i).Columns
        .Add("sample1", GetType(String))
        .Add("sample2", GetType(String))
    End With

    table(i).Rows.Add("a", "b")
    table(i).Rows.Add("c", "d")
End Sub

修改绑定逻辑,增加空判断避免报错:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim i As Integer
    ' 同样要校验输入的i值合法性
    If Not Integer.TryParse(TextBox1.Text, i) OrElse i < 0 Then
        MessageBox.Show("请输入合法的非负整数序号")
        Exit Sub
    End If
    ' 校验序号在数组范围内、对应DataTable已实例化
    If i < table.Length AndAlso table(i) IsNot Nothing Then
        DataGridView1.DataSource = table(i)
    Else
        MessageBox.Show("对应序号的表格不存在")
    End If
End Sub
跨窗体调用说明

如果要在其他窗体加载对应DataTable,直接通过Form1.table(i)访问全局共享数组即可,不需要额外传递参数。

内容的提问来源于stack exchange,提问作者grrpnr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:36:06