トップ回答者
MenuStrip からの Me.Close で例外発生(.NET Framework 3.5 + VB2008)

質問
-
MenuStrip からの終了について質問があります。
以下のコードにて、MenuStripItem から Me.Close を呼び出した後に例外が発生します。
Code SnippetPublic 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.ToolStripMenuItemPrivate 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_ClickEnd 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 SubPrivate Sub EndMenuToolStripMenuItem2_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Me.Close() ' 正常終了
End SubEnd Class
このようなコードはまずいのでしょうか?
よろしくお願いします。
回答
-
Me.Close()でエラーなのではなく、Me.Close()でFormのDisposeが実行されるので、このイベント呼び出し元がDisposeされたオブジェクトにアクセスしてエラーになっているのだと思われます。
Code SnippetPrivate 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
すべての返信
-
Me.Close()でエラーなのではなく、Me.Close()でFormのDisposeが実行されるので、このイベント呼び出し元がDisposeされたオブジェクトにアクセスしてエラーになっているのだと思われます。
Code SnippetPrivate 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