2013-07-27 28 views
3

在发布的问题中:“检查表单是否打开”以下答案张贴为正确。但是,我想知道如何在打开表单之前检查表单的特定实例是否已打开;例如,检查是否再次打开同一记录的编辑屏幕,或者添加新记录的表单是否已经打开。检查vb.net 2010中是否打开了特定的表单实例

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

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似乎可以处理这些情况,并且不需要在后台执行此数据结构,只要采取行动就需要不断更新。有可能使它更通用,以便从应用程序到应用程序很容易重用。

+0

你是什么意思的特定实例?你如何区分一个或另一个实例? –

+0

在你承诺这样做之前,一定要阅读[这个问题](http://stackoverflow.com/questions/3751554/application-openforms-count-0-always)。只需将表单的实例存储在List中,以便稍后您不需要帮助就可以找回它。 –

+0

感谢你报告这个 – smh

回答

2

是的,这可以很容易地修改,以做你正在寻找。

您需要添加一个名为密钥的公共财产(或任何你想)到窗体2,然后你可以使用下面的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 
+0

这是一个很好的开始,我认为,开发一种跟踪表单的方法。不幸的是,从vb6移动到.net删除了跟踪表单打开的能力。我还没有找到任何与之相对应的东西,但我希望找到比我现在所做的更简单的事情。 – smh

0

您编辑屏幕的家长应保存有关其当前编辑屏幕的信息。如果没有,则不会打开编辑屏幕。如果为非Nothing,则设置为当前编辑屏幕。在这种情况下,您不需要处理OpenForms的头痛问题。

+0

是的,谢谢。如果检查表单是否打开,将会阻止错误。 – smh

+0

@smh:如果我的回答很有帮助,请不要忘记注册。 – Neolisk

0

我无法找到VB.Net窗体的任何属性,这些属性可靠地表明窗体已经显示并且仍然没有被处置。 @smh说,令人失望。我的解决方案符合@Hans Passant的建议:“保留列表”,尽管我使用了Collection。 @Hans Passant建议另一篇文章,但它是C#Post。这里是Show后和之前在Visual Basic CloseDispose管理表单代码:

在使用中,我称之为SetOpenForm关闭表单(或当窗体上接受被点击)当创建一个新的形式,RemoveOpenForm时。在这两个事件之间,可以使用表单的名称检索表单及其所有数据。只有每个表单的一个实例一次打开时才有效。

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 
相关问题