2016-11-25 4 views
0

Я думаю, что это простой вопрос, но я изучил здесь другие важные темы, которые не работали для меня, так что вот оно. Нажав определенную кнопку в Form2, появится Form1, а затем, нажав кнопку в Form1, нажмите кнопку в Form2 и покажите сообщение. Я не хочу использовать модуль с глобальной переменной, потому что я это сделал сюда. Есть ли способ получить конкретный экземпляр Form1, а не новый? Эти 2 классы находятся в разных .vb файлов, вот код:Как нажимать кнопку на форме, нажимая кнопку на другой форме в Visual Basic

Public Class Form2 
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles form2Btn1.Click 
    MsgBox("") 
End Sub 

Private Sub form2Btn2_Click(sender As Object, e As EventArgs) Handles form2Btn2.Click 
    Dim newForm1 As New Form1 
    newForm1.ShowDialog() 

End Sub 
End Class 

И код Form1:

Public Class Form1 
    Private Sub form1Btn_Click(sender As Object, e As EventArgs) Handles form1Btn.Click 
    Dim newForm2 As New Form2 
    newForm2.form2Btn1.PerformClick() 

End Sub 
End Class 
+0

Параметр 'Form2' объект в случае щелчка не то же самое, что form2, как показал диалог - вы должны передать его (' Me') в диалоговом окне, возможно, в конструкторе – Plutonix

+0

Спасибо за ответ, да, это была моя проблема, как взять тот же экземпляр формы. –

ответ

0

Предоставление элементам управления формы или их обработчикам событий другим классам не очень хорошая практика. Но вы можете сделать общедоступный метод, который делает тот же персонал, а затем называет его из другой формы.
Основная идея в вашем решении - передать существующий/правильный экземпляр Form2 в Form1, как было предложено @Plutonix в комментариях.

Итак, сначала извлеките логику из обработчика событий button_click в Form1 общедоступному методу.

Public Class Form2 
    Public Sub ShowMessage() 
     MsgBox("") 
    End Sub 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles form2Btn1.Click 
     ShowMessage() ' call the method here 
    End Sub 

    Private Sub form2Btn2_Click(sender As Object, e As EventArgs) Handles form2Btn2.Click 
     'Form implements IDisposable interface so 
     'it is good practice to wrap that instance with Using statement 
     Using newForm1 As New Form1(Me) 
      newForm1.ShowDialog() 
     End using 
    End Sub 
End Class 

Создать конструктор в Form1, который принимает этот экземпляр в качестве параметра

Public Class Form1 
    Private ReadOnly _Form1Instance As Form1 

    Public Sub New(form1Instance As Form1) 
     _Form1Instance = form1instance; 
    End Sub 

    Private Sub form1Btn_Click(sender As Object, e As EventArgs) Handles form1Btn.Click 
     'Use instance of Form2 passed through constructor for calling public method 
     _Form1Instance.ShowMessage() 
    End Sub 
End Class 
+0

Спасибо, я сделаю что-то подобное, я думаю, что это лучший практика –

0

сдирать частное в Form1 Subs, т.е.

Public Class Form2 
Sub Button1_Click(sender As Object, e As EventArgs) Handles form2Btn1.Click 
    MsgBox("") 
End Sub 

Sub form2Btn2_Click(sender As Object, e As EventArgs) Handles form2Btn2.Click 
    Dim newForm1 As New Form1 
    newForm1.ShowDialog() 
End Sub 
End Class 

Так что на Form1 вы можете сделать что-то вроде

Public Class Form1 
    Private Sub form1Btn_Click(sender As Object, e As EventArgs) Handles form1Btn.Click 
    Dim newForm2 As New Form2 
    newForm2.Button1_Click(Nothing, Nothing) 

End Sub 
End Class 
+0

Спасибо за ваш ответ, он работает, но я действительно не хочу менять статус кнопки –

+0

@ Путь Фабио будет работать для вас в этом случае –

Смежные вопросы