VB - Найти дочернюю форму от родителя - PullRequest
0 голосов
/ 29 января 2019

Я нахожусь в проекте с несколькими формами.

Я создаю форму TicTacToe здесь:

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

Вот форма TicTacToe:

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хотел бы вызвать мою функцию Получить в моей основной форме Если я сделаю:

TicTactoe.Receive (S) Он вызывает экземпляр получения, где противник не существует.

Я хотел бы найтипротивоположная форма TicTacToe и вызов Получить

Спасибо

Ответы [ 3 ]

0 голосов
/ 29 января 2019

В C # вам потребуется новый экземпляр, но, как и в VB, компилятор уже сделает это за вас.

То, что вы сейчас делаете, - это создание нового экземпляра TicTacToe Форма и отображение:

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

Но вы нигде не сохраняете этот экземпляр.Затем в следующем фрагменте кода вы используете другой экземпляр, который является статическим, созданным компилятором:

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

Следовательно, в итоге вы вызываете два разных экземпляра, что объясняет, почему существуетоппонент не установлен.

Чтобы обойти эту проблему, не создавайте новый экземпляр.В вашем Private Sub MenuTicTacToe просто используйте экземпляр, созданный компилятором, и у вас не возникнет этой проблемы, например:

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

Надеюсь, это поможет.

0 голосов
/ 29 января 2019

Комментарии в строке

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
0 голосов
/ 29 января 2019

Используйте это, чтобы показать форму

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

Тогда вы можете использовать

page.Receive(S)

Редактировать

Для использования нескольких форм

For Each f As TicTacToe in Application.OpenForms().OfType(Of TicTacToe)
        f.Receive (S)
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...