为什么我的应用程序加载我的文件两次?

时间:2012-09-13 20:58:03

标签: .net vb.net visual-studio-2010 deployment

在我的应用程序中,我有自己的自定义文件类型。我已将其设置为检测应用程序是从已在资源管理器中打开的文件启动还是刚从程序集中打开。一切都运行得很好,除非我的一个文件是从应用程序外部打开的,它会像应该的那样打开应用程序并将文件加载到我的应用程序中的文本编辑器中,就像它应该的那样。除了唯一的问题是它将文件加载到文本编辑器两次。我无法弄清楚为什么。谁能解开一些光明?

在覆盖中调用代码,该覆盖充当表单加载。这是因为我的启动表单在启动时是不可见的,除了它显示通知图标以便可以完成任务,或者可以显示表单。使用其中一些代码的唯一其他位置是在上下文菜单中单击菜单项时,虽然这会打开一个openfiledialog,然后在对话框中打开该文件。

编辑:在子目录中添加了其余代码。

我找到了解决问题的方法,我已经用修复程序回答了我自己的问题。我要感谢任何帮助过的人。  另外,我要感谢Hans Passant,因为他是这里看到的覆盖代码的作者。这允许启动表单保持不可见,同时仍显示通知图标。

     Protected Overrides Sub SetVisibleCore(ByVal value As Boolean)

    If Not Me.IsHandleCreated Then
        Me.CreateHandle()
        value = False
    End If
    MyBase.SetVisibleCore(value)
    If (Environment.GetCommandLineArgs.Length > 1) Then

        Dim s As String = Environment.GetCommandLineArgs(1)

        Using sr As New StreamReader(s)
            While Not sr.EndOfStream
                Dim item As New ListViewItem
                item.SubItems.Add(sr.ReadLine())
                ListView3.Items.Add(item)
            End While
        End Using
        For I = 0 To ListView3.Items.Count - 1
            ListView3.Items(I).Text = CStr(I)
        Next
    End If

答案可以在下面看到。

2 个答案:

答案 0 :(得分:0)

它对你的问题没有帮助,但是有一点重构,你可以避免第二个循环:

With ListView3.Items.Add(ListView3.Items.Count)
  .Subitems.Add(sr.ReadLine())
End With

答案 1 :(得分:0)

我找到了解决问题的方法。我发现它确实是两次发射的代码。最有可能与覆盖有关。尽管如此,仍然不是100%肯定。我创建了一个布尔值,只允许代码触发一次。它现在很棒。感谢所有试图提供帮助的人。

     Protected Overrides Sub SetVisibleCore(ByVal value As Boolean)
    Static blnExecuted As Boolean
    If Not Me.IsHandleCreated Then
        Me.CreateHandle()
        value = False
    End If
    MyBase.SetVisibleCore(value)
    If (Environment.GetCommandLineArgs.Length > 1) Then

        Dim s As String = Environment.GetCommandLineArgs(1)
        If blnExecuted = False Then
            blnExecuted = True
            Using sr As New StreamReader(s)
                While Not sr.EndOfStream
                    Dim item As New ListViewItem
                    item.SubItems.Add(sr.ReadLine())
                    ListView3.Items.Add(item)
                End While
            End Using
            For I = 0 To ListView3.Items.Count - 1
                ListView3.Items(I).Text = CStr(I)
            Next
        End If

    Else
        openscriptfunc()
    End If