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
相关产品推荐
相关产品推荐

