none
MenuStrip からの Me.Close で例外発生(.NET Framework 3.5 + VB2008) RRS feed

  • 質問

  • MenuStrip からの終了について質問があります。

     

    以下のコードにて、MenuStripItem から Me.Close を呼び出した後に例外が発生します。

     

    Code Snippet

    Public Class Form1

        Friend WithEvents MenuStrip1 As System.Windows.Forms.MenuStrip
        Friend WithEvents TopMenuToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
        Friend WithEvents EndMenuToolStripMenuItem1 As System.Windows.Forms.ToolStripMenuItem
        Friend WithEvents EndMenuToolStripMenuItem2 As System.Windows.Forms.ToolStripMenuItem

        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

            Me.MenuStrip1 = New System.Windows.Forms.MenuStrip
            Me.TopMenuToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem
            Me.EndMenuToolStripMenuItem1 = New System.Windows.Forms.ToolStripMenuItem
            Me.EndMenuToolStripMenuItem2 = New System.Windows.Forms.ToolStripMenuItem
            Me.MenuStrip1.SuspendLayout()
            Me.SuspendLayout()

            Me.MenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.TopMenuToolStripMenuItem})
            Me.MenuStrip1.Location = New System.Drawing.Point(0, 0)
            Me.MenuStrip1.Name = "MenuStrip1"
            Me.MenuStrip1.Size = New System.Drawing.Size(292, 24)
            Me.MenuStrip1.TabIndex = 0
            Me.MenuStrip1.Text = "MenuStrip1"

            Me.TopMenuToolStripMenuItem.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.EndMenuToolStripMenuItem1, Me.EndMenuToolStripMenuItem2})
            Me.TopMenuToolStripMenuItem.Name = "TopMenuToolStripMenuItem"
            Me.TopMenuToolStripMenuItem.Size = New System.Drawing.Size(64, 20)
            Me.TopMenuToolStripMenuItem.Text = "親メニュー"

            Me.EndMenuToolStripMenuItem1.Name = "EndMenuToolStripMenuItem"
            Me.EndMenuToolStripMenuItem1.Size = New System.Drawing.Size(152, 22)
            Me.EndMenuToolStripMenuItem1.Text = "終了メニュー(例外発生)"

            Me.EndMenuToolStripMenuItem2.Name = "EndMenuToolStripMenuItem"
            Me.EndMenuToolStripMenuItem2.Size = New System.Drawing.Size(152, 22)
            Me.EndMenuToolStripMenuItem2.Text = "終了メニュー(正常終了)"

            Me.Controls.Add(Me.MenuStrip1)
            Me.MenuStrip1.ResumeLayout(False)
            Me.MenuStrip1.PerformLayout()

            AddHandler TopMenuToolStripMenuItem.DropDownItemClicked, AddressOf MenuToolStripMenuItem_DropDownItemClicked
            AddHandler EndMenuToolStripMenuItem2.Click, AddressOf EndMenuToolStripMenuItem2_Click

        End Sub

        Private Sub MenuToolStripMenuItem_DropDownItemClicked(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs)
            Select Case True
                Case e.ClickedItem Is EndMenuToolStripMenuItem1
                    Me.Close()      ' 例外発生
            End Select
        End Sub

        Private Sub EndMenuToolStripMenuItem2_Click(ByVal sender As Object, ByVal e As System.EventArgs)
            Me.Close()      ' 正常終了
        End Sub

    End Class

     

     

    このようなコードはまずいのでしょうか?

     

    よろしくお願いします。

    2008年12月15日 2:15

回答

  • Me.Close()でエラーなのではなく、Me.Close()でFormのDisposeが実行されるので、このイベント呼び出し元がDisposeされたオブジェクトにアクセスしてエラーになっているのだと思われます。

     

    Code Snippet

        Private Sub MenuToolStripMenuItem_DropDownItemClicked(ByVal sender As Object, ByVal e As ToolStripItemClickedEventArgs)
            Select Case True
                Case e.ClickedItem Is EndMenuToolStripMenuItem1
                    CType(sender, ToolStripMenuItem).DropDown.Close()
                    Me.Close()      ' 例外発生
            End Select
        End Sub

     

     

    他にもComboboxのドロップダウン中に操作してエラーが発生したりするので、DropDown中に何かを削除したりするときはDropDownを閉じておくのが無難なのでしょう。
    2008年12月15日 9:23

すべての返信

  • Me.Close()でエラーなのではなく、Me.Close()でFormのDisposeが実行されるので、このイベント呼び出し元がDisposeされたオブジェクトにアクセスしてエラーになっているのだと思われます。

     

    Code Snippet

        Private Sub MenuToolStripMenuItem_DropDownItemClicked(ByVal sender As Object, ByVal e As ToolStripItemClickedEventArgs)
            Select Case True
                Case e.ClickedItem Is EndMenuToolStripMenuItem1
                    CType(sender, ToolStripMenuItem).DropDown.Close()
                    Me.Close()      ' 例外発生
            End Select
        End Sub

     

     

    他にもComboboxのドロップダウン中に操作してエラーが発生したりするので、DropDown中に何かを削除したりするときはDropDownを閉じておくのが無難なのでしょう。
    2008年12月15日 9:23
  • なるほど!非常に分かりやすい回答をありがとう御座います。

     

    ComboBox でも気をつける事にします。

     

    ありがとう御座いました。

    2008年12月15日 10:24