VB.NET中如何获取非MDI父窗体的名称?
在VB.NET非MDI场景下根据父窗体来源设置子窗体内容
嘿,这个需求我之前也碰到过,针对非MDI的情况,给你分享两种实用的实现方式,你可以根据自己的场景选:
方法1:通过Owner属性判断父窗体(直接简单)
首先,在打开子窗体的时候,一定要把当前父窗体作为Owner参数传给ShowDialog,这样子窗体才能拿到父窗体的引用:
父窗体(parentForm1.vb)代码:
' 打开子窗体的按钮事件或其他逻辑里 Private Sub btnOpenChild_Click(sender As Object, e As EventArgs) Handles btnOpenChild.Click Dim childFormInstance As New childForm() ' 关键:把当前窗体作为Owner传递 childFormInstance.ShowDialog(Me) End Sub
子窗体(childForm.vb)代码:
在子窗体的Load事件里,通过Me.Owner获取父窗体,然后判断它的名称或者类型:
Private Sub childForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load ' 先判断Owner不为空,避免空引用异常 If Me.Owner IsNot Nothing Then ' 方式A:判断父窗体的Name属性 If Me.Owner.Name = "parentForm1" Then TextBox1.Text = "2" Else TextBox1.Text = "3" End If ' 方式B:更推荐!判断父窗体的类型(比名称更可靠,避免后期改名失效) ' If TypeOf Me.Owner Is parentForm1 Then ' TextBox1.Text = "2" ' Else ' TextBox1.Text = "3" ' End If End If End Sub
方法2:构造函数传参(低耦合,更健壮)
如果不想让子窗体依赖父窗体的具体类型或名称,这种方式更灵活,也符合面向对象的设计:
子窗体(childForm.vb)代码:
添加一个带参数的构造函数,用来标记是否来自parentForm1:
Public Class childForm Private _isFromParent1 As Boolean ' 带参数的构造函数,供外部调用 Public Sub New(isFromParent1 As Boolean) InitializeComponent() _isFromParent1 = isFromParent1 End Sub ' 必须保留默认构造函数,否则窗体设计器会报错 Public Sub New() InitializeComponent() End Sub Private Sub childForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load TextBox1.Text = If(_isFromParent1, "2", "3") End Sub End Class
父窗体调用代码:
- parentForm1里打开子窗体:
Dim childFormInstance As New childForm(True) childFormInstance.ShowDialog()
- 其他父窗体打开子窗体:
Dim childFormInstance As New childForm(False) childFormInstance.ShowDialog()
小提示:
- 方法1里优先用判断类型的方式,比判断名称更可靠——万一后期重构改了窗体的
Name属性,代码不会突然失效。 - 不管哪种方法,都要注意空引用检查,比如
Me.Owner IsNot Nothing,避免窗体意外打开时出错。
内容的提问来源于stack exchange,提问作者Pradip Dhakal
相关产品推荐
相关产品推荐

