You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:42:31