请教一个vb.net的窗口之间传递变量值的问题

假设一个主窗口mainform上有三个按钮,点击各个按钮分别显示出form1,form2,form3。 三个窗口完全一样上面都有一个TextBox1 和 一个按钮 button1, 单击button1可以调出同一个子窗口sonform,然后sonform上有个label显示Textbox1的值。 我在三个窗口里定义了一个全局变量str = Textbox1.text, 然后再sonform里调用str的值
If form1.visible then
Label1.text=form1.str
ElseIf form2.visible then
Label1.text=form2.str
ElseIf form3.visible then
Label1.text=form3.str
End If
我通过上面的代码来判断那个窗口被打开,然后显示相应的str值。但是这样的话,得写三遍同样的代码,要是有10个窗口的话,得写十遍。不知道有没有大神有更好的方法,可以使过程和代码更加的简洁,先谢过。
一个form1,然后又建了form2和form3都继承自form1。form1上有按钮bnt1和TxtBox1,通过点击bnt1 调用form4, form4上有按钮,点击按钮获得form1上Txtb1值和form4上Txtb值运算。点击form2上bnt1调用form4,点击form4上的按钮运算,这回用form2上的Txtb1的值了,同理form3。运算写在form4的bnt点击事件里,之前的方法不适用。有什么方法?

用form的ShowDialog这个功能,这个是可以进行窗体间的传值的。

比如在父窗体上需要传的值是textbox1的内容,子窗体是childform.
那么在父窗体上的点击事件中可以这样写
dim frm as childform = New childform
'要在子窗体上的textbox1里显示父窗体中的textbox1中的内容,这样写
frm.textbox1.text = me.textbox1.text
'最后
frm.showdialog()
这样就可以了。
如果说你三个窗体完全一样,那你也不用写三个一样的窗体只要写一个就行了,在不同的按钮事件中做不同的赋值即可。

不过这样打开的子窗体是模态窗体,也就是说在子窗体显示之后,要对父窗体进行操作必需关闭子窗体才行。
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-06-30
        For Each f As Form In My.Application.OpenForms
            If f.ToString Like "Form*" Then
                    Label1.text=f.str
            End If
        Next

 大概这样就可以,My.Application.OpenForms包含的是已打开的窗口。

追问

谢谢您的答复,但是出现错误,因为str并不是windows.Forms.Form的成员,请问该怎么改呢?

追答        For Each f  In My.Application.OpenForms '取消对f的定义
            If f.Name Like "Form*" Then 'toString改为Name
                    Label1.text=f.str
            End If
        Next

追问

非常谢谢您的回复,不好意思我的回复有点晚。还是会出现问题,虽然取消了对f的定义,在第一次单击按钮时没有出现错误,但是在第二次点击时会出现str不是mainform的成员,因为str只定义在form1,2,3中,而且最主要的问题是str的值并没有被传递 T_T。不好意思的再次向您请教有没有更好的解决办法?

追答

难道这句 If f.Name Like "Form*" Then 没用吗?这句是对名字符合条件的才进入操作,就是为了把mainform排除在外。你可以用其它检查方法,如用规则对象:
If System.Text.RegularExpressions.Regex.IsMatch(f.name, "^Form\d+$") Then
这样就相当精确了。

本回答被提问者和网友采纳

请教一个vb.net的窗口之间传递变量值的问题
用form的ShowDialog这个功能,这个是可以进行窗体间的传值的。比如在父窗体上需要传的值是textbox1的内容,子窗体是childform.那么在父窗体上的点击事件中可以这样写 dim frm as childform = New childform '要在子窗体上的textbox1里显示父窗体中的textbox1中的内容,这样写 frm.textbox1.text = ...

vb.net问题,两个程序之间的变量如何传递?
1、建立一个标准EXE,在菜单“工程|引用”中选择前面编译的DLL。2、使用如下代码调用:Private Sub Form_Click()Dim cls As New Class1 cls.ShowMyForm("Hello")End Sub

vb.net 中窗体之间无法传值
不过,在form2的ButtonClick里的dim fr as new Form1,fr.Label1.Text = "AAA"这两句导致了不能传值,因为你重新new了一个Form1,而不是原来的Form1,对象不是一个,所以就没有传值成功。建议你从Form1调用Form2的时候将Form1作为参数传递过去,然后在Form2处理接收参数,这样就可以了。

VB.NET窗体间的数据传递
这样在Form2中使用myForm 就可以对原来的Form1窗口进行操作了。但是你要把要操作的Form1中的域和函数定义成public形式的(这样可能不安全),此时的myForm就是真正的最开始打开的Form1了,你可以用这个实例来进行两个窗体的通讯了。方法2:其实VB.Net中提供了窗体间进行通讯的现成的属性,呵呵,我们能...

VB.NET在不同窗体之间传递参数有哪几种方法
利用全局变量 利用控件属性 在vb.net中两个窗体间的变量可以相互引用了 例如:可以这样用 Public Class Form1 Public asd As Integer Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load asd = 123 End Sub End Class Public Class Form2 Private Sub ...

vb 窗体间传递参数问题
在form1中这么定义 public str as string 在form2中这么调用 print form1.str 相当于在form2中用的时候就是form1.str了。

VB.net 两个窗体之间传递参数
public Form1(要传入的参数){ \/\/把传入的参数传入窗体中 \/\/执行窗体标准内容 } 然后在需要调用的地方调用 Form1 f = new Form1(传出的参数);'---Form1--- Dim f2 As Form2 Private Sub Command1_Click()Set f2 = New Form2 f2.Show vbModal End Sub '---Form1 End--- '---Form...

vb 窗体间传递值
如果是 VB 6.0,您可以考虑通过设置全局变量来在两个窗体间传递数据。如果是 VB.NET 可以这样来进行:假设登录对话框为Form2,确定按钮名称为CmdOK:将 Form2 的 AcceptButton 属性设置为 CmdOK 将 Form2 的 CmdOK 按钮的 DialogResult 设置为 OK 在 Form1 需要添加显示对话框代码的位置添加:Dim ...

VB.net子程序传参的困惑(ByVal 和Byref 没有区别的时候是为什么??)
ByVal e As System.EventArgs) Handles Button3.Click ClearRow(temTable) DataGridView1.DataSource = temTable End Sub这样,就是有区别的了。ByVal方式时,虽然 t 被置为 Nothing ,但是由于 t 和 temTable 并不是一个变量,并不在同一个地址上,所以 temTable 没有变。而 ByRef ...

VB.NET 跨窗口调用数据并更新数据
因为你的代码都是通过新的实例来调用的,所以无法获取A变量的值。解决方法。A form1中, 直接使用 form2.show(); 不创建新的实例。form2中,直接用 textbox1.text = form1.a ;也不要创建form1的实例。B form1调用form2的时间,将本身的实例传递给Form2 .form1中, dim frm2 as new ...

相似回答