Vb.net 将数据绑定到DataGridView
我有一段代码,它从MS SQL Server中的存储过程加载数据,然后将数据加载到一个Vb.net 将数据绑定到DataGridView,vb.net,binding,datagridview,Vb.net,Binding,Datagridview,我有一段代码,它从MS SQL Server中的存储过程加载数据,然后将数据加载到一个DataGridView,效果很好。我希望连接/加载数据的代码位于我的数据库类中,然后与DataGridView相关的所有内容都存储在我的表单中,但我在将BindingSource的内容从数据库传递到表单时遇到问题班级 Form1code: Public Class Form1 Dim myDatabaseObj As New Class1() Dim bindingSource1 As Ne
DataGridView
,效果很好。我希望连接/加载数据的代码位于我的数据库
类中,然后与DataGridView
相关的所有内容都存储在我的表单
中,但我在将BindingSource
的内容从数据库
传递到表单
时遇到问题班级
Form1
code:
Public Class Form1
Dim myDatabaseObj As New Class1()
Dim bindingSource1 As New BindingSource()
Dim connectString As New SqlConnection
Dim objDataAdapter As New SqlDataAdapter
Dim table As New DataTable()
Dim tabletest As New DataTable()
Private Sub loadCompanyList()
Try
Me.dgv_CompanyList.DataSource = Me.bindingSource1
getCompanyList()
Catch ex As NullReferenceException
End Try
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
loadCompanyList()
End Sub
End Class
Public Class Form1
Private Sub loadCompanyList()
Dim myDatabase As New Database
Me.dgv_CompanyList.DataSource = myDatabase.getCompanyList()
End Sub
End Class
Public Class Database
Public Function getCompanyList() As DataTable
Dim dt As New DataTable
Using con As New SqlConnection(connectionString),
cmd As New SqlCommand("sp_GetCompanyList", con) With {.CommandType = CommandType.StoredProcedure}
con.Open()
dt.Load(cmd.ExecuteReader())
End Using
Return dt
End Function
End Class
当我尝试将getCompanyList()
放在一个类中,然后创建一个引用Form()
的新对象时,它似乎不会将表中的任何值返回到MyForm.BindingSource1.Datasource
表示我的DataGridView
不显示任何数据
数据库
类别代码:
.....
Private Sub getCompanyList()
Try
Dim myForm as new Form()
connect_Transaction_Database()
objDataAdapter.SelectCommand = New SqlCommand()
objDataAdapter.SelectCommand.Connection = connectString
objDataAdapter.SelectCommand.CommandText = "sp_GetCompanyList"
objDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure
Dim commandBuilder As New SqlCommandBuilder(Me.objDataAdapter)
Dim table As New DataTable()
table.Locale = System.Globalization.CultureInfo.InvariantCulture
Me.objDataAdapter.Fill(table)
**MyForm.bindingSource1.DataSource = table**
Catch ex As DataException
MsgBox(ex.Message)
Catch ex As NullReferenceException
MsgBox(ex.Message)
End Try
disconnect_Transaction_Database()
End Sub
您希望
getCompanyList
成为一个函数,它返回一个DataTable
。然后,忘记BindingSource
(如果DataGridView
为只读)并将DataSource
属性设置为函数:
Me.dgv_CompanyList.DataSource = getCompanyList
我建议您将
GetCompanyList
方法设置为一个函数,该函数返回由SqlDataAdapter
填充的DataTable
。没有真正的理由让这个子组件依赖于表单。相反,表单中的方法可以调用它来获取DataTable
,然后执行绑定
Public Function GetCompanyList() As DataTable
...
...
Dim table As New DataTable()
table.Locale = System.Globalization.CultureInfo.InvariantCulture
Me.objDataAdapter.Fill(table)
Return table
...
...
这个问题刚刚被用户打断,所以我想我会提供一个答案,这可能会在将来帮助其他人
首先,我会考虑实施:
托管资源由.NET Framework垃圾收集器(GC)处理,无需您进行任何额外编码。托管资源不需要使用块。但是,您仍然可以使用Using块强制处置托管资源,而不是等待垃圾收集器 其次,您不需要使用SqlDataAdapter
。相反,您可以使用类加载数据表
,并返回该数据表。我还将在方法中包含SqlConnection
,而不是在另一个方法中打开和关闭它
您的代码如下所示:
Form1
code:
Public Class Form1
Dim myDatabaseObj As New Class1()
Dim bindingSource1 As New BindingSource()
Dim connectString As New SqlConnection
Dim objDataAdapter As New SqlDataAdapter
Dim table As New DataTable()
Dim tabletest As New DataTable()
Private Sub loadCompanyList()
Try
Me.dgv_CompanyList.DataSource = Me.bindingSource1
getCompanyList()
Catch ex As NullReferenceException
End Try
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
loadCompanyList()
End Sub
End Class
Public Class Form1
Private Sub loadCompanyList()
Dim myDatabase As New Database
Me.dgv_CompanyList.DataSource = myDatabase.getCompanyList()
End Sub
End Class
Public Class Database
Public Function getCompanyList() As DataTable
Dim dt As New DataTable
Using con As New SqlConnection(connectionString),
cmd As New SqlCommand("sp_GetCompanyList", con) With {.CommandType = CommandType.StoredProcedure}
con.Open()
dt.Load(cmd.ExecuteReader())
End Using
Return dt
End Function
End Class
数据库
代码:
Public Class Form1
Dim myDatabaseObj As New Class1()
Dim bindingSource1 As New BindingSource()
Dim connectString As New SqlConnection
Dim objDataAdapter As New SqlDataAdapter
Dim table As New DataTable()
Dim tabletest As New DataTable()
Private Sub loadCompanyList()
Try
Me.dgv_CompanyList.DataSource = Me.bindingSource1
getCompanyList()
Catch ex As NullReferenceException
End Try
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
loadCompanyList()
End Sub
End Class
Public Class Form1
Private Sub loadCompanyList()
Dim myDatabase As New Database
Me.dgv_CompanyList.DataSource = myDatabase.getCompanyList()
End Sub
End Class
Public Class Database
Public Function getCompanyList() As DataTable
Dim dt As New DataTable
Using con As New SqlConnection(connectionString),
cmd As New SqlCommand("sp_GetCompanyList", con) With {.CommandType = CommandType.StoredProcedure}
con.Open()
dt.Load(cmd.ExecuteReader())
End Using
Return dt
End Function
End Class
Up投票决定停止第三次社区碰撞,因为这是最全面的答案,但我不一定同意避免SqlDA-dt。Load在内部使用适配器anyway@CaiusJard是的,回到这里,我同意。无需不使用
SqlDataAdapter
。