2013-12-08 125 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

相關問題