vb.net - 如何使用SUB多次打开相同的表单

时间:2017-01-28 12:23:48

标签: .net vb.net winforms

您可能认为这与此相关的其他问题重复。但它不是

我已经看到了几个不同的问题,但没有人回答这个问题。

我想多次使用SUB打开一个表单。我传入Form的地方,它会创建此表单的新实例。但是,如果我运行两次Form,我一直遇到问题

这是不起作用的子:

Public Shared Sub OpenProgram(ByRef formToOpen As Form)
    Dim newApp As Form
    newApp = formToOpen
    Try
        newApp.Show()
        newApp.BringToFront()
    Catch ex As Exception
        MsgBox("Unable to open program :(")
    End Try
End Sub

我也尝试了Dim newApp As New FormDim newApp As New formToOpen,但这些都不起作用

如果我尝试运行sub,然后关闭表单,然后再次运行sub,我只会遇到问题。

我得到的错误是:

  

无法访问已处置的对象
对象名称:'shop'

shop只是表格

提前致谢

4 个答案:

答案 0 :(得分:1)

选项一,with generics

Public Function OpenProgram(Of F As {Form, New})(ByVal ThisOne As F) As F
    Return New F()
End Function

选项二,without generics

Public Function OpenProgram(ByVal ThisOne As Form) As Form
    Return CType(Activator.CreateInstance(ThisOne.GetType()), Form)
End Function

用法:

Dim newApp As Form = OpenProgram(shop)
newApp.Show

答案 1 :(得分:0)

如果主窗体有2个按钮和下面的代码,还有其他两种形式,可以反复点击按钮打开表格的倍数,关闭它们对打开更多不起作用。

Public Class MasterForm
    Private Sub btnOpenForm1_Click(sender As Object, e As EventArgs) Handles btnOpenForm1.Click
        ShowForm(New Form1)
    End Sub

    Private Sub btnOpenForm2_Click(sender As Object, e As EventArgs) Handles btnOpenForm2.Click
        ShowForm(New Form2)
    End Sub

    Private Sub ShowForm(WhichForm As Form)
        With WhichForm
            .Show()
            .BringToFront()
        End With
    End Sub
End Class

enter image description here

答案 2 :(得分:0)

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Try
            Dim x As String = Application.ExecutablePath

            Process.Start(x)

        Catch ex As Exception
            MsgBox("Executable path does not exist", MsgBoxStyle.Information, "New Window")
        End Try
    End Sub

答案 3 :(得分:-1)

您的“关闭”表单在您处理之前不会关闭,它只是没有显示。您需要遍历表单并显示要再次查看的表单。你可能会使用这样的东西 -

Private Sub cmdOpenForm_Click(sender As Object, e As EventArgs) Handles  cmdOpenForm.Click

    Dim frmCollection = System.Windows.Forms.Application.OpenForms
    If frmCollection.OfType(Of frmShop).Any Then
        frmCollection.Item("frmShop").Activate()
    Else
        Dim frmShop As New frmShop
        frmShop.Show()
    End If

    Me.Close()
    Me.Dispose()
End Sub

close和dispose部分指向您当前所在的表单。由于表单是对象,您需要再次激活它们才能使用它们,或者您需要再次重新创建它们以显示该表单的新实例。 / p>

希望这就是你要找的东西。