VB.NET已加载窗体传值问题:VS2012中停靠窗体赋值无效
解决Form2修改Form1文本框内容的问题
你的代码问题很明确:在Form2的按钮点击事件里,你新建了一个Form1的实例x,这个对象和你之前打开Form2的那个原Form1窗口完全是两个独立的对象,所以修改x的TextBox值根本不会影响到正在显示的(尤其是停靠在主窗体里的)Form1。下面给你两种靠谱的解决方案:
方案1:利用Owner属性直接操作原Form1
因为你打开Form2时用了Form2.ShowDialog(Me),这里的Me就是原Form1,所以Form2的Owner属性指向的就是那个打开它的Form1。我们只需要把Owner转换成Form1类型,就能直接操作原窗口的控件:
步骤1:调整Form1控件的访问权限(或封装成属性)
默认情况下TextBox是Private的,Form2无法直接访问,你可以选两种方式:
- 简单快捷:在Form1的设计器里,选中TextBox,把
Modifiers属性改成Public - 更规范封装:在Form1里添加一个公共属性来暴露TextBox的内容:
' Form1中的代码 Public Property InputText As String Get Return TextBox1.Text End Get Set(value As String) TextBox1.Text = value End Set End Property
步骤2:修改Form2的按钮点击事件
' Form2中的按钮点击代码 Public Sub Button1_Click(ByVal sender As Object, e As EventArgs) Handles Button1.Click ' 将Owner转换为Form1类型 Dim originalForm1 As Form1 = DirectCast(Me.Owner, Form1) ' 如果你用了公共属性就写下面这句,否则直接写originalForm1.TextBox1.Text = "tes" originalForm1.InputText = "tes" Me.Close() ' 关闭Form2 End Sub
方案2:用事件/委托实现解耦(更推荐)
如果不想让Form2直接依赖Form1的结构,用事件的方式更符合面向对象的封装原则——Form2只负责触发事件传递值,Form1自己处理赋值逻辑:
步骤1:在Form2里定义事件
' Form2中的代码 ' 定义一个传递字符串的事件 Public Event UpdateText(ByVal newValue As String) Public Sub Button1_Click(ByVal sender As Object, e As EventArgs) Handles Button1.Click ' 触发事件,传递要设置的文本"tes" RaiseEvent UpdateText("tes") Me.Close() End Sub
步骤2:在Form1里订阅事件
' Form1中的按钮点击代码 Public Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim frm2 As New Form2() ' 订阅Form2的UpdateText事件 AddHandler frm2.UpdateText, AddressOf UpdateTextBoxContent frm2.ShowDialog(Me) ' 记得移除事件,避免内存泄漏 RemoveHandler frm2.UpdateText, AddressOf UpdateTextBoxContent End Sub ' 处理事件的方法,负责修改TextBox的值 Private Sub UpdateTextBoxContent(ByVal value As String) TextBox1.Text = value End Sub
为什么原来的方法失效?
你之前写的Dim x As New form1会创建一个全新的Form1实例,这个实例和当前停靠在主窗体里的Form1没有任何关系——它是一个独立的窗口(只是你没显示它而已),所以修改它的TextBox自然不会反映到原窗口上。未停靠时你可能误把新实例当成了原窗口,但本质上还是两个完全独立的对象。
内容的提问来源于stack exchange,提问作者Ary Maulana
相关产品推荐
相关产品推荐

