.NET Core 3.1设置Form2.MdiParent为Form1报错,Framework可正常运行
.NET Core 3.1中设置MdiParent报错的问题分析与解决
错误原因
在.NET Framework的VB.NET中,编译器提供了默认窗体实例的语法糖——直接使用窗体类名(如Form2)时,会自动访问一个预创建的实例。但.NET Core 3.1及后续版本移除了这个特性,所有非共享成员(包括MdiParent)必须通过具体的对象实例访问,直接用类名调用就会触发Reference to a non-shared member requires an object reference错误。
解决方案
1. 手动创建Form2实例并设置MdiParent
修改Form1的Form1_Load事件代码,先实例化Form2,再设置父窗体并显示:
Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' 手动创建Form2实例 Dim form2 As New Form2() ' 设置MDI父窗体为当前Form1实例 form2.MdiParent = Me ' 显示Form2 form2.Show() End Sub End Class
2. 关键前置设置
确保Form1的IsMdiContainer属性已设为True:
- 可以在设计器中选中Form1,在属性面板找到
IsMdiContainer并勾选; - 也可以在代码中手动设置:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.IsMdiContainer = True ' 先开启MDI容器模式 Dim form2 As New Form2() form2.MdiParent = Me form2.Show() End Sub
3. 持久化Form2实例(可选)
如果需要在Form1的其他方法中访问同一个Form2实例,可将实例变量声明为类级成员:
Public Class Form1 ' 类级变量存储Form2实例 Private _form2Instance As Form2 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.IsMdiContainer = True _form2Instance = New Form2() _form2Instance.MdiParent = Me _form2Instance.Show() End Sub ' 示例:其他方法中访问Form2实例 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click _form2Instance.Activate() End Sub End Class
内容的提问来源于stack exchange,提问作者Unis
相关产品推荐
相关产品推荐

