VB.NET中类里如何使用新窗体?DataGrid数据源赋值异常求助
解决VB.NET中窗体实例与DataGridView数据源设置的问题
嘿,我来帮你搞定这两个VB.NET的问题!咱们一个个说清楚:
问题1:如何在类中正确使用已打开的窗体实例
你现在的代码里在DataGrid类中新建了一个CegHozzadas窗体对象,但这是一个全新的、后台运行的窗体实例,并不是用户实际看到的那个打开的窗体。正确的做法是把当前已经打开的窗体实例传递给DataGrid类的方法,而不是在方法里重新创建。
问题2:实例化新窗体后数据源设置失效的原因
你直接执行Ceghozzadas.DataGridCeg.DataSource=...时能正常工作,是因为你操作的是当前显示的那个窗体实例;但在DataGridFill方法里,你新建了Dim thisform As New CegHozzadas,这个实例和用户正在看的窗体完全是两个对象,你给这个后台实例的DataGrid设置数据源,自然不会在界面上看到任何变化。
修正后的代码示例
我们调整一下代码,让DataGridFill方法接收当前窗体实例作为参数:
Public Class CegHozzadas Private Sub CegHozzadas_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim DataGridFill As New DataGrid() ' 把当前窗体实例(Me)传递给DataGridFill方法 DataGridFill.DataGridFill(Me) End Sub End Class Public Class DataGrid ' 修改方法,接收CegHozzadas窗体实例作为参数 Public Sub DataGridFill(targetForm As CegHozzadas) ' 直接操作传递过来的、用户可见的窗体实例 targetForm.DataGridCeg.DataSource = ... ' 你的数据源逻辑 End Sub End Class
额外建议
如果你的DataGrid类只是负责填充数据,其实可以考虑把数据源填充逻辑封装成返回数据源的方法,然后在窗体里直接赋值,这样耦合度更低,比如:
Public Class CegHozzadas Private Sub CegHozzadas_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim DataGridFill As New DataGrid() ' 直接获取数据源并赋值给当前窗体的DataGrid Me.DataGridCeg.DataSource = DataGridFill.GetDataSource() End Sub End Class Public Class DataGrid ' 返回数据源的方法 Public Function GetDataSource() As Object ' 在这里编写获取/构建数据源的逻辑,比如从数据库查询 Return ... ' 返回你的数据源(DataTable、List等) End Function End Class
这样代码逻辑更清晰,也避免了类直接操作窗体控件的耦合问题。
内容的提问来源于stack exchange,提问作者Danielz
相关产品推荐
相关产品推荐

