【问题标题】:vb.net code to close another form if it is openvb.net 代码关闭另一个窗体,如果它是打开的
【发布时间】:2017-10-12 08:55:30
【问题描述】:

这是非常初级的,但我无法弄清楚。

如果 form1 仍然打开,我想在 form2 关闭时以编程方式关闭 form1。 Form2 是由 form1 上的命令按钮打开的。

Form1上打开Form2的代码是:

Dim frm As New form2
frm.Show()

当 Form2 关闭以关闭所有打开的 Form1 副本时,最好的方法是什么?

【问题讨论】:

  • 只需为 FormClosed 事件添加一个事件处理程序并调用 Me.Close()
  • 我正在尝试向 form2 添加一个事件处理程序,因此当它关闭时,它会关闭 form1(如果 form1 已打开)。 Me.Close() 会关闭 form2,不是吗?我将如何关闭 form1?
  • 不,代码属于Form1类。很难看出为什么这是个问题,也许你还不知道 AddHandler 语句。将 AddHandler frm.FormClosed, AddressOf(yadayada) 作为您发布的 sn-p 中的第二条语句。并添加yadayada方法,只需要Me.Close()

标签: vb.net


【解决方案1】:

如果你想独立处理你的两个表单,你需要从第三个表单或类中监视它们。所以我的建议是在第三个类中创建它们,并将第二个表单的引用传递给第一个表单,以便它可以打开它。这样:

Public Class MyHelper

    Public Sub CreateForms()
        Dim form2 as New Form2()
        AddHandler form2.Closed, AddressOf Form2_OnClosed

        ‘ Create as many copies as you need
        Dim form1 as New Form1(form2)
        form1.Show()
    End Sub

    Protected Sub Form2_OnClosed(sender as object, e as EventArgs) 
        ‘ Same code for each form1 that has been created and opened.
        If (form1.IsOpen) Then form1.Close()
    End Sub

End Class


Public Class Form1

    Private _form2 as Form2

    Public Property IsOpen as Boolean = false

    Public Sub New(form2 as Form2)
        _form2 = form2
    End Sub

    Protected Sub MyButton_Click(sender as object, e as EventArgs) handles MyButton.Click
        ‘ You open your form here or wherever you want (even on the constructor)
        _form2.Show()
    End Sub

    Protected Sub Me_OnClosed(sender as object, e as EventArgs) handles Me.Closed
        Me.IsOpen = false
    End Sub

    Protected Sub Me_OnShown(sender as object, e as EventArgs) handles Me.Shown
        Me.IsOpen = true
    End Sub

End Class

【讨论】:

  • 那么如何判断表单是否打开?如果用户可能在打开 form2 后关闭了它怎么办?
【解决方案2】:

添加此引用以使其工作。

Imports System.Linq

If Application.OpenForms().OfType(Of Form1).Any Then
   MsgBox("Form1 is open")
End If

【讨论】:

    【解决方案3】:

    假设您有 3 个表单并希望在单击按钮时关闭另外两个表单

    Private Sub EMPLEADOToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles EMPLEADOToolStripMenuItem.Click
        If Application.OpenForms().OfType(Of BUSCAR_INDEX).Any Then
            BUSCAR_INDEX.Close()
        ElseIf Application.OpenForms().OfType(Of MIEMBROS_INDEX).Any Then
            MIEMBROS_INDEX.Close()
        End If
        EMP_INDEX.Show()
        EMP_INDEX.EmpIDTextBox.Text = EmpIDTextBox.Text
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      相关资源
      最近更新 更多