【发布时间】: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