Vb.net 将数据绑定到DataGridView

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

我有一段代码,它从MS SQL Server中的存储过程加载数据,然后将数据加载到一个
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