2013-03-15 82 views
20

我給這個問題了解更多的知識。我怎樣才能知道,而它的運行檢查表單是否打開

Dim frmCollection As New FormCollection() 
    frmCollection = Application.OpenForms() 
    If frmCollection.Item("Form2").IsHandleCreated Then 
     MsgBox("Yes Opened") 
    Else 
     Dim f As New Form2() 
     With f 
      .Text = "form2" 
      .Show() 
     End With 
    End If 

如果我多次執行這個代碼,如果形式在我的應用程序打開過,爲了不再次打開它,我的意思是不是要創建相同形式的實例它會創建窗體的多個實例窗體2 我如何檢查是否這種形式是不是已經打開

回答

34

,您可以嘗試這樣的:

If Application.OpenForms().OfType(Of Form2).Any Then 
    MessageBox.Show("Opened") 
Else 
    Dim f2 As New Form2 
    f2.Text = "form2" 
    f2.Show() 
End If 
+0

謝謝 我也發現這個代碼,這對我有幫助, '------------ Public Function isOpened(ByVal frm As Form)As Boolean? 昏暗frmCol作爲新的FormCollection() frmCol = Application.OpenForms 昏暗CNT爲整數= 0 對於每個F作爲形成frmCol 如果f.Name = FRM。Name Then Cnt + = 1 Next Return IIf(Cnt> 0,True,False) End Function '------------------------ - 雖然我找到了答案,但我會嘗試你的。 – 2013-03-15 19:22:28

+1

我意識到這是標記爲vb.net,但我偶然發現了這個尋找C#答案。如果其他人做了相同的語法是:Application.OpenForms.OfType ().Any()。與VB版本略有不同。 – 2013-10-08 19:55:40

+0

此解決方案不再有效。 – 2017-08-10 19:52:51

8

您可以使用下面的代碼:

If myForm.IsHandleCreated then 
    myForm is open 
End If 
0

給出的答案的擴展(謝謝你,所有的),這裏有一個簡單的方法來啓動或顯示:

Dim frmCollection = System.Windows.Forms.Application.OpenForms 
If frmCollection.OfType(Of Form2).Any Then 
    frmCollection.Item("Form2").Activate() 
Else 
    Dim newForm2 = New Form2 
    newForm2.Show() 
End If 
+0

「Any」不再有效。 – tmighty 2017-11-10 00:06:29

3

更多簡單,你可以創建一個公共靜態布爾變量,它會告訴表格是否打開。在表單加載事件分配'真'和關閉事件分配'假'值。

1

討厭成爲殺人的喜悅,但有一天會有人試圖理解你的代碼。

Dim frm as New frmDontknow 
Dim frmCollection = System.Windows.Forms.Application.OpenForms 
For i As Int16 = 0I To frmCollection.Count - 1I 
    If frmCollection.Item(i).Name = frm.Name Then 
     frmCollection.Item(i).Activate() 
     Exit Sub 
    End If 
Next i 

然後根據需要做show等嗎?

+0

您能否更好地指出解決問題的代碼更改與提高可維護性的問題截然不同? – 2015-10-25 01:05:44

0

從一個由HumbleBeginnings出臺了另一個重構方法:

Dim xChildWindows = Application.OpenForms.OfType(Of frmForm2) 
    If xChildWindows.Any Then 
     xChildWindows.First().Focus() 'Focus if exists 
    Else 
     Dim xfrmNew As New frmForm2() 'Open window if doeasn't exists 
     xfrmNew.MdiParent = Me 
     xfrmNew.Show() 
    End If 
+0

「任何」都不起作用了。 – tmighty 2017-11-10 00:06:57

0

你可以試試這個

Dim formText As String 
Dim prevText As String 

Private Sub OpenForm(ByVal frm As Windows.Forms.Form) 
     formText = frm.Text 
     If formText = prevText Then Exit Sub 
     CloseForms() 
     ' Make it a child of this MDI form before showing it. 
     frm.MdiParent = Me 
     frm.Show() 
     frm.Location = New Point(0, 0) 
     prevText = formText 
    End Sub 

    Private Sub CloseForms() 
     For Each ChildForm As Form In Me.MdiChildren 
      ChildForm.Close() 
     Next 
    End Sub 

    Private Sub NewToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PayablesToolStripMenuItem.Click 
      OpenForm(frmPayables) 
     End Sub 
+0

歡迎來到Stackoverflow!回答6個其他時間已經回答的問題。包含一些關於您的答案如何幫助的文本很有幫助,這在以前的答案中尚未解釋。 – buczek 2016-12-13 17:40:28

+0

我只想分享我的想法。以幫助我。 – 2016-12-14 12:19:51

1

檢查表格被打開,爲了驗證一個表單是開放的,我們用這種方法和函數能夠從任何形式調用並使用較少的代碼。

示例: 這將在mdiContainer和帶有3個按鈕的面板對象的窗體中使用它,以顯示3個窗口窗體。

進口系統 進口的System.Reflection

Private Sub OpenWindowsForm(ByVal FormName As String) 
    Dim instForm As Form = Application.OpenForms.OfType(Of Form)().Where(Function(frm) frm.Name = FormName).SingleOrDefault() 
    If instForm Is Nothing Then 
     Dim frm As New Form 
     frm = DirectCast(CreateObjectInstance(FormName), Form) 
     frm.MdiParent = Me 
     Me.Panel1.Controls.Add(frm) 
     Me.Panel1.Tag = frm 
     frm.Show() 
    Else 
     instForm.Select() 
     instForm.WindowState = FormWindowState.Maximized 
     instForm.BringToFront() 
    End If 
End Sub 

Public Function CreateObjectInstance(ByVal objectName As String) As Object 
    Dim obj As Object 
    Try 
     If objectName.LastIndexOf(".") = -1 Then 
      objectName = [Assembly].GetEntryAssembly.GetName.Name & "." & objectName 
     End If 

     obj = [Assembly].GetEntryAssembly.CreateInstance(objectName) 

    Catch ex As Exception 
     obj = Nothing 
    End Try 
    Return obj 

End Function 

如何在點擊事件使用 私人小組btnRegistro_Click(發送者爲對象,E作爲EventArgs的)把手btnRegistro.Click OpenWindowsForm( 「Registro」) 結束子

Private Sub btnBusqueda_Click(sender As Object, e As EventArgs) Handles btnBusqueda.Click 
    OpenWindowsForm("Busqueda") 
End Sub 

Private Sub btnCalendario_Click_1(sender As Object, e As EventArgs) Handles btnCalendario.Click 
    OpenWindowsForm("Calendario") 
End Sub 

Here is an image of the Sample code