Как создать контекстные меню, которые изменяют текущий элемент управления?

#.net #vb.net #winforms

#.net #vb.net #winforms

Вопрос:

В моем приложении RichTextBox динамически создается при открытии определенной формы. В настоящее время при нажатии на поле открывается окно OpenFileDialog , где пользователь выбирает файл, а затем местоположение файла вводится в RichTextBox .

Мой конечный пользователь сказал мне вчера, что вместо этого он хочет следующее:

  • Щелчок левой кнопкой мыши RichTextBox должен открыть указанный файл в проводнике
  • Щелчок правой кнопкой мыши должен открыть ContextMenuStrip , причем одним из вариантов в строке является «Выбрать файл».

Мой пересмотренный код содержится в следующих основных положениях:

Мой подраздел OpenFileDialog, который обрабатывает .Click событие для ToolStripMenuItem

 Sub openFileDialog(ByVal sender As System.Windows.Forms.ToolStripMenuItem, ByVal e As System.EventArgs)
    Dim myOpenFileDialog As New OpenFileDialog()

    If Not sender.GetCurrentParent().Parent.Text = "" Then
        myOpenFileDialog.InitialDirectory = sender.GetCurrentParent().Parent.Text
    Else
        myOpenFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
    End If

    myOpenFileDialog.Filter = "All files (*.*)|*.*"
    myOpenFileDialog.FilterIndex = 1
    myOpenFileDialog.RestoreDirectory = True

    If myOpenFileDialog.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
        sender.GetCurrentParent().Parent.Text = myOpenFileDialog.FileName
    End If
End Sub
  

Мой подзаголовок fileControlRightClicked, который обрабатывает щелчок правой кнопкой мыши на RichTextBox

 Sub fileControlRightClicked(ByVal sender As System.Windows.Forms.RichTextBox, ByVal e As System.Windows.Forms.MouseEventArgs)
    If e.Button <> Windows.Forms.MouseButtons.Right Then Return

    Dim cms = New ContextMenuStrip
        'cms.Parent = sender
        Dim item1 = cms.Items.Add("Select File")
        item1.Tag = 1
        AddHandler item1.Click, AddressOf openFileDialog
        cms.Show(sender, e.Location)
End Sub
  

Кроме этих двух фрагментов кода, тогда единственным релевантным кодом, о котором я могу думать, является

AddHandler .MouseUp, AddressOf fileControlRightClicked

Который используется при объявлении RichTextBox .

Как мне сослаться на конкретный экземпляр RichTextBox , на который нажимается?

Очевидно, что использование sender.GetCurrentParent().Parent не работает, и ни то, ни другое не работает sender.GetCurrentParent.SourceControl . (Их можно увидеть в сути OpenFileDialog выше)

Если я пропустил какую-либо соответствующую информацию или код или не был уверен в возникшей у меня проблеме, пожалуйста, прокомментируйте, и я исправлю / добавлю любую необходимую информацию.

Ответ №1:

Я думаю, вам просто нужно немного кастинга, чтобы получить RichTextBox в openFileDialog :

 Sub openFileDialog(ByVal sender As System.Windows.Forms.ToolStripMenuItem, ByVal e As System.EventArgs)
    Dim menu = DirectCast(sender.GetCurrentParent(), ContextMenuStrip)
    Dim rtb = DirectCast(menu.SourceControl, RichTextBox)
    ...
End Sub