Foxhunt
Foxhunt

Reputation: 901

VB - Find child form from parent

I am in a project with multiple form.

I create a TicTacToe form here :

 Private Sub MenuTicTacToe(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim page As Form = New TicTacToe
    page.Show(Me)
End Sub

Here is a TicTacToe form:

Public Class TicTacToe

    Public opponent as String
    'Some code where user set opponent

    Public Function Receive(S As String)
    if string = opponent
        'Some code
    End Function

End Class

I would like to call my function Receive in my main form If i do:

TicTactoe.Receive(S) It call a instance of Receive where opponent does not exist.

I would like to find the oppened form of TicTacToe and call Receive

Thanks

Upvotes: 0

Views: 366

Answers (3)

Precious Uwhubetine
Precious Uwhubetine

Reputation: 3007

Use this to show the form

Dim page As TicTacToe
Private Sub MenuTicTacToe(ByVal sender As Object, ByVal e As System.EventArgs)
    page = New TicTacToe
    page.Show(Me)
End Sub

Then you can use

page.Receive(S)

Edit

To use multiple forms

For Each f As TicTacToe in Application.OpenForms().OfType(Of TicTacToe)
        f.Receive (S)
Next

Upvotes: 0

Mary
Mary

Reputation: 15101

Comments in line

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    page.Receive("Joe")
End Sub
'A form level variable to hold a reference to the instance of TicTacToe
'Although vb.net can use default instances, you have created an explicit
'instance of TicTacToe so you need to keep a reference if you want to
'refer to this instance.
Private page As TicTacToe
Private Sub MenuTicTacToe(ByVal sender As Object, ByVal e As System.EventArgs)
    page = New TicTacToe()
    page.Show(Me)
End Sub

Partial Public Class TicTacToe
    Inherits Form
    Public opponent As String
    'Functions must be declared as a Type
    'If you do not need a return value use a Sub
    Public Function Receive(S As String) As String
        Dim someString As String = ""
        If S = opponent Then
            'Do something
        End If
        'There must be a return Value
        Return someString
    End Function

End Class

Upvotes: 1

Twometer
Twometer

Reputation: 1731

In C#, you'd need a new instance, but as you are in VB, the compiler already does that for you.

What you are currently doing, is creating a new instance of the TicTacToe form and showing it:

Private Sub MenuTicTacToe(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim page As Form = New TicTacToe
    page.Show(Me)
End Sub

But you don't save that instance anywhere. Then, in your next piece of code, you are using a different instance, which is the static one created by the compiler:

TicTacToe.Receive(S) // TicTacToe is the static instance

Therefore, you end up calling two different instances, which explains why there is no opponent set.

To get around this problem, do not create a new instance. In your Private Sub MenuTicTacToe, just use the instance created by the compiler, and you won't have this problem, just like this:

Private Sub MenuTicTacToe(ByVal sender As Object, ByVal e As System.EventArgs)
    TicTacToe.Show(Me)
End Sub

Hope this helps.

Upvotes: 0

Related Questions