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

VB.NET窗体显示隐藏时报非共享成员需对象引用错误如何解决

错误原因

该报错的本质是你直接使用窗体类名调用实例成员(比如Show方法、控件属性),类是代码定义的模板,必须先创建它的实例对象才能访问实例成员。你项目中所有直接写try.Show()、view.dgvView、sky.Show()的位置,都是把类名直接当实例用了,所以触发报错。

修复方案

1. 第一步:统一管理窗体实例(Form1中修改)

为了保证多个窗体之间数据互通,避免每次打开窗体新建实例导致数据丢失,先在Form1的类级别(所有Sub方法之外)声明全局的窗体实例:

Public Class Form1 ' 替换为你实际的Form1类名
    ' 全局声明Form2、Form3的唯一实例
    Private form2Ins As New try() ' 替换为你实际的Form2类名
    Private form3Ins As New sky() ' 你的Form3类名是sky无需修改

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles gin.Click
        Dim nun As String = "apple"
        Dim pw As Single = 7
        ' 注意:原代码中变量名name、wd和控件名重名,修改变量名避免冲突
        Dim inputName As String
        Dim inputPw As Double
   
        inputName = name.Text
        inputPw = word.Text
   
        If (inputName = nun And inputPw = pw) Then
            Me.Hide()
            ' 给Form2、Form3互相传递实例引用,方便跨窗体访问
            form2Ins.form3Ref = form3Ins
            form3Ins.form1Ref = Me
            form2Ins.Show() ' 用实例调用Show,不是用类名
        Else
            MsgBox("Denied", vbOKOnly + MsgBoxStyle.Critical, "TRY AGAIN")       
        End If
    End Sub
End Class

2. 第二步:修改Form2代码

首先找到Form3里的dgvView控件,右键→属性→找到Modifiers选项,改成Public,这样其他窗体可以访问这个控件。
然后在Form2的类级别添加Form3的实例引用,修改保存按钮代码:

Public Class try ' 替换为你实际的Form2类名
    ' 用来接收Form1传递过来的Form3实例
    Public form3Ref As sky

    Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Save.Click
        ' 先判断是否有可用行,没有就新增一行,避免空引用报错
        If form3Ref.dgvView.CurrentRow Is Nothing OrElse form3Ref.dgvView.Rows.Count = 0 Then
            form3Ref.dgvView.Rows.Add()
        End If
        Dim currentRow = form3Ref.dgvView.CurrentRow
        currentRow.Cells(1).Value = Id.Text
        currentRow.Cells(2).Value = fruit.Text
        currentRow.Cells(3).Value = veggie.Text
        currentRow.Cells(4).Value = pasta.Text
        currentRow.Cells(5).Value = drink.Text
        ' 保存完成可以直接打开Form3查看数据
        Me.Hide()
        form3Ref.Show()
    End Sub
End Class

3. 第三步:修改Form3代码

先在Form3类级别添加Form1的实例引用,修改按钮点击代码,同时修正单元格点击事件的错误逻辑:

Public Class sky
    ' 用来接收Form1传递过来的Form1实例,方便返回登录页
    Public form1Ref As Form1 ' 替换为你实际的Form1类名

    Private Sub dgvView_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvView.CellContentClick
        ' 注意:原代码Handles后绑定的sky.CellContentClick错误,已修正为控件名dgvView的事件
        If e.ColumnIndex = 1 AndAlso e.RowIndex >=0 Then
            ' 原代码New sky(Me)是实例化自身属于逻辑错误,如果你需要弹出Form2修改数据改为如下代码
            Dim entry As New try() ' 替换为你实际的Form2类名
            entry.form3Ref = Me
            entry.ShowInTaskbar = False
            entry.ShowDialog()
        End If
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles blue.Click
        Me.Close()
        ' 用传进来的Form1实例打开,不要直接写类名sky.Show()
        form1Ref.Show()
    End Sub
End Class

内容的提问来源于stack exchange,提问作者user17309987

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:45:05