我有一些代码从MS SQL Server中的存储过程加载数据,然后将数据加载到DataGridView
,这可以正常工作。我想要的是将连接/加载数据的代码放在我的Database
类中,然后将与DataGridView
相关联的所有内容存储在我的Form
中,但是我遇到了问题BindingSource
的内容Form
从Database
类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
班级代码:
{{1}}
答案 0 :(得分:0)
您希望getCompanyList
成为一个函数,它返回DataTable
。然后,忘记BindingSource
(如果DataGridView
是只读的)并将DataSource
属性设置为函数:
Me.dgv_CompanyList.DataSource = getCompanyList
答案 1 :(得分:0)
我建议您将GetCompanyList
方法转换为一个函数,该函数返回由DataTable
填充的SqlDataAdapter
。这个Sub应该依赖于表单是没有真正原因的。相反,表单中的方法可以调用它来获取DataTable
,然后执行绑定。
Public Function GetCompanyList() As DataTable
...
...
Dim table As New DataTable()
table.Locale = System.Globalization.CultureInfo.InvariantCulture
Me.objDataAdapter.Fill(table)
Return table
...
...
答案 2 :(得分:0)
这个问题刚刚被Community用户提出,所以我想我会提供一个可能在将来帮助其他人的答案。
首先,我会考虑实施Using:
托管资源由.NET Framework垃圾收集器(GC)处理,无需您进行任何额外编码。对于托管资源,您不需要使用“使用”块。但是,您仍然可以使用“使用”块来强制处理受管资源,而不是等待垃圾回收器。
其次,您不需要使用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