首先,虽然它可能是也可能不是问题的根源,但这条线:
DataGridView1.DatSource = mydataset.Tables("MyTable").DefaultView
包含一个错字。应该是 DataGridView1.DataSource。似乎这会导致编译器错误。
除此之外,尝试简化类似于下面的内容,如果您仍然遇到绑定问题,请在调试器中逐步检查以确保一切按预期工作。此外,检查 dgv 控件上的“自动生成列”属性是否设置为 true。
我不清楚您要做什么,因此以下是我将如何处理此问题的一个非常一般的示例。
- 首先,将您的连接字符串移动到项目设置文件,并使用 My.Settings.MyConnectionStringName 来引用它。
- 其次,在 SQL 中使用参数,而不是内联。
- 将您的数据访问内容包装在“使用”块中。Using 将为您处理块范围内的对象的处置,通常是一种更清洁的方法。
- 只是我个人的喜好,但我不喜欢数据集带来的所有 bs 开销,一个简单的数据表就可以做到。
- 我在这里没有尽可能完全地做到这一点,但我建议将数据检索与分配给 UI 控件分开。更重要的是,我可能会进行下一步,并将控件分配与表单加载事件分开。您可能会发现表单中有多个地方需要刷新或重置数据源。
有多种方法可以解决这个问题,我的不一定是“流行的方式。但是,下面的方法刚刚对我有用。
简化您的代码,并进行一些重构:
Imports System.Data
Imports System.Data.OleDb
Public Class TechScreen
Private Sub TechScreen_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
'Not sure where your TechScreenID input parameter is coming from, so this is just for example:
Dim TechID As Integer = 1
' Use a function to return the data to be used as the DataSource for the dgv control:
DataGridView1.DataSource = Me.JobListTable(TechID)
End Sub
Private Function JobListTable(TechID As Integer) As DataTable
Dim dt As DataTable = Nothing
Dim SQL As String = "SELECT * FROM joblist WHERE techID = @TechID"
' The Using block handles disposal of objects initialized:
Using con As OleDbConnection = New OleDbConnection(My.Settings.MyConnection)
Using cmd As OleDbCommand = New OleDbCommand(SQL, con)
' Use parameters instead of inline concatenation for cleaner code,
' and protection against sql injection attacks:
cmd.Parameters.AddWithValue("@TechID", TechID)
con.Open()
dt = New DataTable()
Try
dt.Load(cmd.ExecuteReader())
Catch
MsgBox("There was an error retrieving data")
Finally
con.Close()
End Try
End Using
End Using
Return dt
End Function
End Class