如何创建修改当前控件的上下文菜单?

时间:2014-07-01 14:26:49

标签: .net vb.net winforms

在我的应用程序中,在打开某个表单时动态创建RichTextBox。目前,点击该框会打开OpenFileDialog,用户在其中选择文件,然后将文件位置放入RichTextBox

我的最终用户昨天告诉我,他反而想要以下内容:

  • 左键单击RichTextBox应该在资源管理器中打开指定的文件
  • 右键单击应打开ContextMenuStrip,条带中的一个选项为"选择文件"。

我修改后的代码包含在以下Gists中:

我的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 个答案:

答案 0 :(得分: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