【问题标题】:Visual Basic DataGridView NullReferenceExceptionVisual Basic DataGridView NullReferenceException
【发布时间】:2015-01-09 20:01:11
【问题描述】:

我正在处理一个 Windows 窗体项目,并且遇到了其中一个窗体中的一个 DataGridView 对象的问题。这是我目前所拥有的:

Private Sub CustomerUsageForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Me.Tbl_usageTableAdapter1.Fill(Me.ClarityWaterDBMAINDataSet1.tbl_usage)

    Dim con As New OleDb.OleDbConnection
    Dim dbString As String
    Dim ds As New DataSet
    Dim da As OleDb.OleDbDataAdapter
    Dim sql As String

    dbString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\ClarityWaterDBMAIN.accdb"

    con.ConnectionString = dbString
    con.Open()

    sql = "SELECT * FROM tbl_usage"
    da = New OleDb.OleDbDataAdapter(sql, con)
    da.Fill(ds, "tbl_usage")
    con.Close()

然后当表单被激活时,这段代码就会运行:

    Private Sub CustomerUsageForm_Activated(sender As Object, e As EventArgs) Handles MyBase.Activated
    Dim GridInitializedBoolean As Boolean = False

    'Initialize the grid's binding
    If Not GridInitializedBoolean Then
        'bind and format the grid
        DataGridView1.DataSource = BindingSource1

        SetUpGridColumns()

        GridInitializedBoolean = True
    End If
End Sub

Private Sub SetUpGridColumns()
    'sets up the columns for the data grid view
    Try
        With DataGridView1
            .Columns!usage_id.Visible = False
            .Columns!reading_date.HeaderText = "Reading Date"
            .Columns!reading_cf.HeaderText = "Amount Used"
            .Columns!account_id.HeaderText = "Account ID"
        End With
    Catch ex As Exception
        MessageBox.Show("Error Setting up the grid." & ex.Message)
    End Try
End Sub

当我加载表单时,SetUpGridColumns() 方法会抛出 NullReferenceException。我不确定为什么会发生这种情况,我将这个表单设置为与另一个完美运行的表单完全一样:

 Private Sub InventoryForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'TODO: This line of code loads data into the 'ClarityWaterDBMAINDataSet.tbl_customers' table. You can move, or remove it, as needed.
    Me.Tbl_customersTableAdapter.Fill(Me.ClarityWaterDBMAINDataSet.tbl_customers)

    Dim con As New OleDb.OleDbConnection
    Dim dbString As String
    Dim ds As New DataSet
    Dim da As OleDb.OleDbDataAdapter
    Dim sql As String

    dbString = "Provider=Microsoft.ACE.OLEDB.12.0;DataSource=|DataDirectory|\ClarityWaterDBMAIN.accdb"

    con.ConnectionString = dbString
    con.Open()

    sql = "SELECT * FROM tbl_customers"
    da = New OleDb.OleDbDataAdapter(sql, con)
    da.Fill(ds, "tbl_customers")

    con.Close()
    AccountNumberTextBox.Focus()


    CustomerUsageForm.CustomerUsageForm_Load(sender, e)
    CustomerUsageForm.Hide()
End Sub

那么这就是按钮点击事件上的事件

Private Sub SearchButton_Click(sender As Object, e As EventArgs) Handles SearchButton.Click
    'retrieve the customer search information
    Dim GridInitializedBoolean As Boolean = False

    'initialize the grids binding
    If Not GridInitializedBoolean Then
        'bind and format the grid
        CompanyIDLookupDataGridView.DataSource = CompanyLookupBindingSource

        SetUpGridColumns()

        GridInitializedBoolean = True
    End If

    Try
        CompanyLookupBindingSource.Filter = BuildSearchString()
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

我很抱歉这么长的帖子。老实说,我不确定还能尝试什么。谁能帮助解释我为什么会遇到这些问题?

编辑:我所说的设置完全相同的意思是,两种形式都具有相同类型的对象,加载事件的编码相同,初始化网格的事件也相同。

如果我注释掉第一个 .Columns! SetUpGridColumns() 方法中的行,错误将在下一行引发。

【问题讨论】:

  • 如果 NRE 发生在 SetUpGridColumns 中,请确保列名正确。我不认识 !.Columns!usage_id.Visible = False 中的使用,但我已经很久没有做过 WinForms 了。
  • 将表单加载代码移动到显示的表单中,看看你是否得到不同的结果;但我会摆脱爆炸(!)运算符。你应该知道GridInitializedBoolean 没有做任何事情——作为本地变量,它总是错误的
  • 这就是我对 GridInitializedBoolean 的看法,我主要将它包含在我基于此的示例代码中。
  • 向后工作,如果 DGV 在 Columns 设置中是 Nothing -- 使用断点 (F9) 检查并将鼠标悬停在它上面 -- 那么很可能是构造函数 (Sub New) 做了不完整,并且您正在处理“静默异常”(请参阅​​什么是... VB 答案)。另一个技巧是将配置更改为 AnyCPU 并运行它 - 它很可能会在其他地方崩溃并告诉您问题。或张贴表格的Sub New

标签: database vb.net forms datagridview nullreferenceexception


【解决方案1】:

据我所见,您似乎在您的列的 with 语句中有一个额外的字符...您也说过...

“我不确定为什么会发生这种情况,我将这个表单设置为与另一个完美运行的表单完全一样”

如果是这样的话,这段代码在哪里,我很想看看这个表单的代码。

   'You have a ! that shouldn't be referenced for your columns...
   With DataGridView1
        .Columns!usage_id.Visible = False
        .Columns!reading_date.HeaderText = "Reading Date"
        .Columns!reading_cf.HeaderText = "Amount Used"
        .Columns!account_id.HeaderText = "Account ID"
   End With

这应该是它的样子......

    With DataGridView1
        .Columns(usage_id).Visible = False
        'And so on for the rest of your columns...
    End With

【讨论】:

  • 我会看看如何更改 !对于括号,尽管 SetUpGridColumns() 方法在不引发错误的其他形式中的工作方式完全相同
  • 正在工作的表单包含在原始帖子中,InventoryForm_Load() 和 Searchbutton_Click() 事件都在同一个表单中。
  • 异常是调用 SetupGridColumns() 方法(您在此答案中包含的方法)时引发的 NullReferenceException
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多