2013-12-08 97 views
0

所以我尝试使用公共变量将数据从Form1发送到Form2。我没有得到任何错误,但字符串“另一个测试”没有出现在Form1的文本框中。我这是做这件事的正确方法?在全局窗口之间传递值

' ### Form1 ### 
Public Class Form1 
    Public MyData As String 

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     MyData = "test" 
    End Sub 
End Class 

' ### Form2 ### 
Public Class Form2 
    ' Form1 
    Private Form1 As New Form1 

    Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     If Form1.MyData = "test" Then 
      Form1.Textbox1.text = "another test" 
     End If 
    End Sub 
End Class 
+1

我建议只使用属性来获得表格/设定值然后从这些属性的文本框中显示。更好的是'DataBinding',但如果你还没有准备好,请尝试一些其他的时间。暴露公共领域和控制通常被认为是一个坏主意。有一个原因'.NET'语言具有属性。 – ja72

回答

1

这将是更好地设置MyData = "test"在Form1的构造函数,而不是在onload事件。更好的办法是通过它的构造函数传递你想让Form2知道的值。这使得它更清楚它的依赖者是谁而不是从静态/全局状态拉动。如果它确实需要使用Form1然后传递表单,如果它只需要字符串,然后只传递字符串。总是给班级最低限度的他们需要做他们的工作。这使得它们更加松散耦合,并且更容易测试和使用。


如果首先加载form1,这将是一种方法。原因是它可以让你将现有的form1传递给form2的构造函数。否则,你要创建一个新的Form1中,我不认为这是你想要做

Public Class Form2 
    Form Form1 

    Sub New(ByVal form1 as Form)  
     Form1 = form 
    EndSub 

    Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     If Form1.Data = "test" Then 
      Form1.Textbox1.text = "another test" 
     End If 
    End Sub 
End Class 

Public Class App 
    Sub Main 
     Form1 f1 = new Form1(); 
     // display f1 
     Form2 f2 = new Form2(f1); 
     // display f2 
    End Sub 
End Class 
+0

你能告诉我一个例子吗? –

+0

@ Mr.1.0当然,我发布了一个例子。 – Despertar

1

的问题是,你正在创建2个Form1中clases,例如一个属于yourproject什么。 Form1上,第二个是yourproject.form2.form1,那becasue要创建属于类形式2.

Public Class Form2 
' Form1 
Private Form1 As New Form1 ' in this line you are creating a new form1 class that belongs to form2 

Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If Form1.MyData = "test" Then 
     Form1.Textbox1.text = "another test" 
    End If 
End Sub 
End Class 

一种新的形式,你有两个选择:

  1. 删除Private Form1 As New Form1

  2. 更改此行Form1.Textbox1为nameofyourproject.form1,因此vb知道你正在谈论的形式1。

希望它可以帮助

0

1)中提到的命名问题。如果VB不是困惑,我是

2)你做一个新的表单(新),但从不显示它。 NEW运行如此,你可以在构造函数中传递信息。否则,您需要显示Load中要执行的代码的表单。

Public Class Form1 
Public MyData As String 

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
     Handles Me.Load 
    MyData = "test" 
End Sub 
End Class 

' ### Form2 ### 
Public Class Form2 
    ' Form1 
    ' really bad naming 
    'Private Form1 As New Form1 
    Private frm1 As New Form1   ' only a little better 

    Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) 
     Handles Me.Load 

     frm1.Show ' SHOW form1 so the LOAD runs, not just NEW 

     If frm1 .MyData = "test" Then 
      frm1 .Textbox1.text = "another test" 
     End If 
    End Sub 
End Class 

Bravo用于实例化表单,但一般形式不应该与其他表单的控件混淆。换句话说,使用构造函数,但在这种情况下不行。如果你想让Form2从Form1中获取一些文本 - 谁创建了他。 Form1中:

Dim frm2 As New Form2("some data to pass") 

在窗口2:

Public Sub New(txt As String) 

    ' NEVER add code before the InitializeComponent call 
    ' This call is required by the Windows Form Designer. 
    InitializeComponent() 

    ' Add any initialization after the InitializeComponent() call. 
    Label1.Text = txt 

End Sub 
+0

我得到'Handles Me.Load'的语法错误' –

+0

'New'是一个类似于事件的标准过程,你应该从列表中选择它并添加一行代码(但它不在事件列表中 - 看看表格特效列表)。如果你有一个较老版本的VS,它不会处理未标记的换行符,把'Handles Me.Load'移动到上面的行(就像你在所有其他处理程序中看到的那样)。注意:当您的OP询问从另一个表单“获取”数据时,该方法将数据从一种表单“推送”到另一种表单! – Plutonix

+0

我得到它的工作也有没有办法做到这一点,而不必打开一个额外的form1窗口? 'frm1.Show' –

0

这可能是你想要什么:

' --------- 
Public Class Form1 

    Private innerData As String 
    Public Property MyData() As String 
     Get 
      Return innerData 
     End Get 
     Set(ByVal value As String) 
      innerData = value 
     End Set 
    End Property 

    Public Property TextData() As String 
     Get 
      Return TextBox1.Text 
     End Get 
     Set(ByVal value As String) 
      TextBox1.Text = value 
     End Set 
    End Property 

End Class 

' --------- 
Public Class Form2 

    Private frm1 As New Form1 

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs) 
     MyBase.OnLoad(e) 

     If frm1 IsNot Nothing Then 
      frm1.Show() 
     End If 
    End Sub 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     frm1.MyData = "test" 
     frm1.TextData = "another test" 
    End Sub 
End Class 

result

+0

这是接近我想要的。所以我在Form1上有一个打开Form2的按钮。如果我使用它有效,但打开一个新的Form1窗口,现在有两个Form1窗口。是否可以将“另一个测试”发送到打开Form2的原始Form1窗口? –

+0

在我的代码中只有一个'Form1'存在,因为语句'Private frm1 As New Form1'只被调用一次。我不清楚你在问什么。 “Form1”总是可见的,还是隐藏起来并用按钮显示? – ja72

相关问题