4

在发布的问题中:“检查表单是否已打开”,下面的答案被发布为正确的。但是,我想知道如何在打开表单之前检查表单的特定实例是否已打开;例如,当另一个执行相同操作的表单已经打开时,检查是否再次打开同一记录的编辑屏幕,或添加新记录的表单。

以下是作为原始问题正确答案发布的代码。可以修改它来做我需要的吗?提前致谢。

If Application.OpenForms().OfType(Of Form2).Any Then

  MessageBox.Show ("Opened")

Else

  Dim f2 As New Form2

  f2.Text = "form2"

  f2.Show()

End If

一个特定的实例将是一个正在编辑表格中的特定记录的表单。我还将跟踪编辑的状态(表单是否处于编辑模式)或者,如果此表单有一个子表(编辑此记录的子表的表单);父窗体在子窗体关闭之前无法退出。

我目前创建了一个打开表单的树,它们的名称、它们正在编辑的记录和编辑状态,它们的关闭在树中更新。答案#2 乍一看似乎可以处理这些情况,并且不需要在后台拥有这个数据结构,无论何时采取行动都需要不断更新。可以使它更通用,以便可以轻松地在应用程序之间重用它。

4

4 回答 4

3

是的,这可以很容易地修改为您正在寻找的东西。

您需要向 Form2 添加一个名为 Key(或任何您想要的)的公共属性,然后您可以使用下面的 ShowOrOpenForm 方法来实现您的目标:

Public Sub ShowOrOpenForm(sKey As String)

    If ShowFormForKey(sKey) Then
        MessageBox.Show("Opened")
    Else
        Dim f2 As New Form2

        f2.Key = sKey
        f2.Text = "form2"
        f2.Show()
    End If
End Sub

Private Function ShowFormForKey(sKey As String) As Boolean

    For Each oForm As Form2 In Application.OpenForms().OfType(Of Form2)()
        If oForm.Key = sKey Then
            oForm.Show()
            Return True
        End If
    Next

    Return False
End Function
于 2013-07-27T20:50:27.123 回答
0

编辑屏幕的父级应存储有关其当前编辑屏幕的信息。如果没有,则没有打开编辑屏幕。如果非Nothing,则设置为当前编辑屏幕。在这种情况下,您不需要处理OpenForms.

于 2013-07-27T20:53:52.443 回答
0

我找不到 VB.Net 表单的任何属性来可靠地表明该表单已显示但仍未被处置。正如@smh 所说,令人失望。我的解决方案是按照@Hans Passant 的建议:“保留一个列表”,尽管我使用了一个集合。@Hans Passant 建议了另一个帖子,但它是 C# 帖子。Show这是在 Visual Basic前后Close或在 Visual Basic中管理表单的代码Dispose

在使用中,我SetOpenForm在创建新表单、RemoveOpenForm关闭表单(或单击表单上的接受)时调用。GetOpenForm在这两个事件之间,可以使用& 表单的名称来检索表单及其所有数据。在一次只打开每个表单的一个实例的情况下是有效的。

Public Shared cOpenForms As Collection  'Place this at the top of your
                                        'set of Forms, e.g. in your MyApp Class.
cOpenForms = New Collection             'Place this in the load sequence of MyApp.

Public Shared Sub SetOpenForm(NamedForm As Form)
    'Saves an Open Form in the Collection of Open Forms
    'Call this every time a New Form is created (if you want to revisit it).
    MyApp.cOpenForms.Add(NamedForm)
End Sub

Public Shared Sub RemoveOpenForm(NamedForm As Form)
    'Removes an Open Form in the Collection of Open Forms, if it is present.  
    'Silently ignores Forms that are not in the Collection.
    'Call this every time a Form is finished with, Closed, Disposed.
    If Not IsNothing(NamedForm) Then
        If MyApp.cOpenForms.Contains(NamedForm.Name) Then
            MyApp.cOpenForms.Remove(NamedForm.Name)
    End If
End Sub
Public Shared Function GetOpenForm(FormName As String) As Form
    'Retrieves a Form if it is in the Collection of Open Forms
    'Call this to retrieve Form FormName; then check for IsNothing.
    For Each f As Form In MyApp.cOpenForms
        If f.Name = FormName Then
            Return f
        End If
    Next
    Return Nothing
End Function
于 2017-05-01T23:23:19.493 回答
0
 Dim frm2 As New form2

    If isFormNotOpened(frm2) Then
        frm2.Show()
    End If

Private Function isFormNotOpened(ByVal ThisFrm As Form) As Boolean

    Dim xfrm As Form

    isFormNotOpened = True

    For Each xfrm In Application.OpenForms

        If xfrm.Name = ThisFrm.Name Then

            MsgBox(" !!! Already Opened !!! ", MsgBoxStyle.OkOnly + MsgBoxStyle.Exclamation)
            xfrm.Activate()

            isFormNotOpened = False
            Exit Function

        End If
    Next


End Function
于 2020-01-25T17:42:26.130 回答