2012-12-07 115 views
0

我試圖從啓動窗體中按鈕的事件處理程序實例化的單獨的類修改應用程序啓動窗體上的控件。從外部類設置文本值

這是在主窗體的點擊收聽:

Sub Button1Click(sender As Object, e As EventArgs) 
    Dim changer As New Changer() 
    changer.dochange 

End Sub 

這是類換:

Public Class Changer 
Sub dochange 
    'ignore this part 
    Dim window As Form1 
    window = New Form1() 
    window.Show 

      'this is where i have a problem: 
    Dim bunz As MainForm 
    bunz = New MainForm() 
    bunz.label1.Text = "sometext" 
End Sub 
End Class 

我甚至成立了我的LABEL1,以便它是公共的,但文字仍然不會改變。哪裏不對?

+0

你永遠不會顯示你的'bunz'表單,這個代碼示例是否完整? – Kratz

回答

2

您遇到的問題是因爲您正在創建第二個Mainform並更改第二個標籤文本而不是原始文本。你需要做的是爲你換類創建事件和訂閱它在你的MainForm,然後用它來更改標籤的文本

的mainText

Public Class MainForm 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     Dim changer As New Changer() 
     AddHandler changer.ChangeText, AddressOf ChangeTextHandler 
     changer.dochange() 
    End Sub 

    Private Sub ChangeTextHandler(value As String) 
     Label1.Text = value 
    End Sub 

End Class 

換類

Public Class Changer 
    Public Event ChangeText(value As String) 
    Sub dochange() 
     'ignore this part 
     Dim window As Form1 
     window = New Form1() 
     window.Show() 
     RaiseEvent ChangeText("SomeText") 
    End Sub 
End Class 
+0

感謝您的幫助。我是VB新手,希望只能在鼠標偵聽器中創建一個對象,而不是處理程序和對象。但我想這就是VB的方式。 – turnt

+0

@javac在C#和VB.Net中這樣做是一種很好的做法,孩子不應該知道父內部的知識。如果您希望可以在設置標籤的父級上創建屬性,然後將父級傳遞給更換器類的構造函數,則可以設置該屬性。 –

1

下面的代碼示例應該可以工作。在VB中,您並不總是需要顯式聲明或引用您要修改的表單。如果它已經作爲主窗體打開或者使用Shared ShowDialog方法打開,那麼可以在此情況下將Label1引用爲窗體的共享屬性。沒有必要創建一個單獨的實例。

Public Class MainForm 
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     Dim changer As New Changer() 
     changer.dochange() 
    End Sub 
End Class 

Public Class Changer 
    Sub dochange() 
     'ignore this part 
     Dim window As Form1 
     window = New Form1() 
     window.Show() 

     'this is where i have a problem: 
     MainForm.Label1.Text = "sometext" 
    End Sub 
End Class 

以上是兩個單獨的文件一個一個從Visual Studio中通過添加類添加Windows窗體和其他創建的MainForm.vb文件。

+0

謝謝。現在它會打開兩個窗口,並打開窗體的一個新實例並顯示「sometext」。但是,我如何更改第一個實例? – turnt

+0

它是Windows窗體應用程序,MainForm是您在應用程序啓動時打開的窗體嗎?此外,MainForm中的還是輔助表單中的Button1Click事件處理程序? –

+0

按鈕點擊是在主窗體中也有按鈕。在按鈕中點擊是創建類更改器的新實例,並調用方法(dochange)。我想要打開一個新窗口(Form1是窗口,它成功地打開它),但我希望它也可以將第一個窗體中的標籤文本更改爲「sometext」 – turnt

1

這正是我所尋找的。我想清除另一個班級的formn上的狀態條標籤。在表單中,我添加了AddHandler otherClass.ChangeText,AddressOf ChangeTextHandler和子ChangeTextHandler。在其他類中,我做了RaiseEvent ChangeText(「」),它工作。謝謝!謝謝!有一件事,我一直對獲得共享感到熱情......會被忽略。我將事件定義爲公共共享事件ChangeText(值爲字符串),沒有更多的問題。很高興在這裏有一些非常聰明的人。