2010-04-05 88 views
0

我有一些代码从MS SQL Server中的存储过程加载数据,然后将数据加载到DataGridView,这很好。我想要的是连接/加载数据的代码位于我的Database类中,然后与DataGridView相关的所有内容都将存储在我的Form中,但我在将BindingSource的内容传递给FormDatabase类。绑定到DataGridView的数据

Form1代码:

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 

当我尝试的地方getCompanyList()的一类,然后创建一个新的对象,引用Form()它似乎并没有从表中返回任何价值的MyForm.BindingSource1.Datasource意思我DataGridView不显示数据。

Database类代码:

..... 
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 

回答

0

你想getCompanyList是一个函数,它返回一个DataTable。然后,忘记了BindingSource(如果DataGridView是只读的),并设置DataSource属性功能:

Me.dgv_CompanyList.DataSource = getCompanyList 
0

我会建议你做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 
... 
... 
0

这个问题刚刚被Community用户碰着,所以我想我会提供一个答案可以帮助别人的未来。

首先,我会考虑实施Using

管理资源由.NET Framework垃圾收集器(GC),无需您任何额外的编码处理。您不需要使用受管资源的块。但是,仍然可以使用Using块强制处理托管资源,而不是等待垃圾回收器。

其次,您不需要使用SqlDataAdapter。相反,您可以使用SqlCommand类加载DataTable并返回该类。我还会在方法中包含SqlConnection,而不是在另一个中打开和关闭它。

您的代码将是这个样子:

Form1代码:

Public Class Form1 

    Private Sub loadCompanyList() 
     Dim myDatabase As New Database 
     Me.dgv_CompanyList.DataSource = myDatabase.getCompanyList() 
    End Sub 

End Class 

Database代码:

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