Пересмотренный ответ для лучшего понимания вопроса:
Поскольку ContextMenuStrip реализует IDisposable, вам нужно будет либо добавить его в список компонентов, управляемых формой, чтобы он располагался соответствующим образом и автоматически, либо самостоятельно управлять удалением, как предлагается в исходном вопросе.
Вот ревизия вашего класса, которая будет поддерживать автоматическое удаление так же, как и окна, если бы вы добавили ContextMenuStrip непосредственно в форму:
Friend Sub New(ByVal objControl As System.Windows.Forms.Control, ByVal components As System.ComponentModel.IContainer)
m_objControlContainer = objControl
m_mnuCopyCell2Clipboard = New ToolStripMenuItem("Copy Cell")
m_PopupMenu = New ContextMenuStrip(components)
m_PopupMenu.Items.AddRange(New ToolStripMenuItem() {m_mnuCopyCell2Clipboard})
End Sub
Чтобы вызвать этот новый конструктор из вашей формы или пользовательского элемента управления:
Private m_objPopUpMenu As clsContextPopUpMenu
m_objPopUpMenu = New clsContextPopUpMenu(DGVTable, Me.components)
Обратите внимание, что я также удалил ByRef
из конструктора, поскольку он не требуется, что также устраняет необходимость приведения элементов управления перед передачей их конструктору.
Еще одно примечание: раньше («в прошлое») компоненты не обязательно присутствовали в каждой форме или пользовательском элементе управления. Я считаю, что это изменилось / было исправлено, но если вы обнаружите, что без него, это легко добавить вручную:
Private components As System.ComponentModel.IContainer
В вашем конструкторе:
Me.components = New System.ComponentModel.Container()
В вашем методе Dispose (я добавил метод полного удаления, если его еще нет; если он есть, просто добавил код, связанный с компонентами):
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub