Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查表单的特定实例是否在vb.net 2010中打开_Vb.net - Fatal编程技术网

检查表单的特定实例是否在vb.net 2010中打开

检查表单的特定实例是否在vb.net 2010中打开,vb.net,Vb.net,在张贴的问题:“检查表单是否打开”中,以下答案被张贴为正确答案。但是,我想知道如何在打开表单之前检查表单的特定实例是否已打开;例如,检查同一记录的编辑屏幕是否正在再次打开,或者检查用于添加新记录的表单是否已打开,而用于执行相同操作的另一表单已打开 以下是原始问题的正确答案代码。可以修改它以满足我的需要吗?提前谢谢 If Application.OpenForms().OfType(Of Form2).Any Then MessageBox.Show ("Opened") Else

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

以下是原始问题的正确答案代码。可以修改它以满足我的需要吗?提前谢谢

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乍一看,它似乎可以处理这些情况,并且不需要在后台使用这种数据结构,只要采取行动,就需要不断更新这种数据结构。可能会使它更通用,以便在不同的应用程序之间轻松重用

是的,可以很容易地修改它以满足您的需要

您需要在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

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

而头疼。我找不到VB.Net表单的任何属性,它可以可靠地指示该表单已显示,但尚未被处理。正如@smh所说,这是一种失望。我的解决方案是按照@Hans Passant的建议:“保留一个列表”,尽管我使用了一个集合@汉斯·帕桑特提出了另一个帖子,但这是一个C#post。下面是在Visual Basic中,在
显示
之后和
关闭
处置
之前管理表单的代码:

在使用中,我在创建新表单时调用
SetOpenForm
,在关闭表单时调用
RemoveOpenForm
(或者在表单上单击Accept)。在这两个事件之间,可以使用
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

你所说的一个具体例子是什么意思?你将如何区分一个实例或另一个实例?在你承诺这样做之前,请务必阅读。只需将表单实例存储在列表中,这样以后就不需要帮助查找它。谢谢您的报告是的,谢谢。如果检查表单是否打开,这将防止出现错误。我认为,这是开发跟踪表单方法的良好开端。不幸的是,从vb6迁移到.net删除了跟踪表单打开的功能。我还没有找到任何与之对应的东西,但我想找到比我现在所做的更简单的东西。
 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