如何从其他窗体按钮修改子窗体Form2中Label的文本值?
问题根源
你这个问题是VB.NET的窗体默认实例机制导致的:
- Form1中通过
New Form2()创建的是Form2的一个独立实例,并加载到Panel中显示; - Form2里调用
Form3.ShowDialog()时,打开的是Form3的默认实例; - Form3中
Form2.Label1.Text = "NEW FORM 2"修改的是Form2的默认实例的Label,而不是Form1中实际显示的那个Form2实例,所以界面上看不到任何变化。
解决方案
下面两种方法都能解决问题,选哪个都行:
方法1:通过构造函数传递Form2实例
先改Form3的代码,加一个带参数的构造函数,接收Form2实例,然后直接修改这个实例的Label:
Public Class Form3 Private _targetForm2 As Form2 ' 带参数的构造函数,传入要修改的Form2实例 Public Sub New(targetForm As Form2) InitializeComponent() _targetForm2 = targetForm End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 修改传入的Form2实例的Label文本 _targetForm2.Label1.Text = "NEW FORM 2" Me.Close() ' 改完可以直接关掉Form3 End Sub End Class
再改Form2中打开Form3的代码,把当前Form2实例传进去:
Public Class Form2 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 创建Form3时把当前Form2对象传进去 Dim frm3 As New Form3(Me) frm3.ShowDialog() End Sub End Class
方法2:利用窗体的Owner属性
先改Form2打开Form3的代码,把当前Form2设为Form3的Owner:
Public Class Form2 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim frm3 As New Form3() frm3.Owner = Me ' 设置当前Form2为Form3的所有者 frm3.ShowDialog() End Sub End Class
然后改Form3的代码,通过Owner获取Form2实例并修改Label:
Public Class Form3 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ' 通过Owner拿到Form2实例,强制转换后修改Label DirectCast(Me.Owner, Form2).Label1.Text = "NEW FORM 2" Me.Close() End Sub End Class
关键注意点
不管用哪种方法,必须把Form2中的Label1的Modifiers属性改成Public(默认是Private,外部无法访问)。操作方法:在Form2的设计器里选中Label1,在右侧属性窗口找到Modifiers,改成Public。
内容的提问来源于stack exchange,提问作者Karl
相关产品推荐
相关产品推荐

