从ContextMenuStrip中识别源图表/控件单击

时间:2014-02-13 11:42:36

标签: vb.net visual-studio visual-studio-2012 mschart contextmenustrip

我有一个包含大量图表的表单,并在右键单击图表时添加了ContextMenuStrip,以便用户可以将图表图像复制到剪贴板

 Public Sub Chart_Click(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Chart1.MouseClick, _
          Chart2.MouseClick, Chart3.MouseClick, Chart4.MouseClick 

    If e.Button = MouseButtons.Right Then
        Dim cmus As ContextMenuStrip = New ContextMenuStrip

        Dim cms1 As ToolStripMenuItem = New ToolStripMenuItem("Copy as Image")
        cms1.Tag = 0
        cmus.Items.Add(cms1)

        For Each c As ToolStripMenuItem In cmus.Items
            AddHandler c.Click, AddressOf Chart_cMenu_Click
        Next

        cmus.Show(New Point(Control.MousePosition.X, Control.MousePosition.Y))
    End If

End Sub

然后我想确定点击了哪个图表,以便我可以将该图表复制到剪贴板。 这对我来说似乎是一个简单的问题,但我无法弄清楚为什么无论我做什么试图识别右键单击菜单中的OwnerParentSourceControl总是给我一个{ {1}}价值。

Nothing

如何识别源图表?

2 个答案:

答案 0 :(得分:0)

有一个混乱的解决方案。如果能够形成一个更优雅的解决方案,那么就要保持开放状态。

为反映ContextMenuStrip的新Sender添加名称。然后可以在MouseClick方法中使用它来查找原点

Public Sub Chart_Click(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Chart1.MouseClick, _
      Chart2.MouseClick, Chart3.MouseClick, Chart4.MouseClick 

       If e.Button = MouseButtons.Right Then
            Dim cmus As ContextMenuStrip = New ContextMenuStrip

            'Add the name to menu
            cmus.Name = sender.Name & "_CMS"

            Dim cms1 As ToolStripMenuItem = New ToolStripMenuItem("Copy as Image")
            cms1.Tag = 0
            cmus.Items.Add(cms1)

            For Each c As ToolStripMenuItem In cmus.Items
                AddHandler c.Click, AddressOf Chart_cMenu_Click
            Next

            cmus.Show(New Point(Control.MousePosition.X, Control.MousePosition.Y))
       End If

End Sub

现在找到与新名称对应的控件

Public Sub Chart_cMenu_Click(ByVal sender As Object, ByVal e As EventArgs)

    Dim cms As ToolStripMenuItem = CType(sender, ToolStripMenuItem)
    Dim _owner As ContextMenuStrip = CType(cms.Owner, ContextMenuStrip)

    'This is where you use the name attached to the ContextMenuStrip
    Dim _chartname As String = Replace(_owner.Name, "_CMS", "")

    Dim parentObject As Chart = Nothing
    Try
        parentObject = CType(Me.Controls.Find(_chartname, True)(0), Chart)
    Catch ex As Exception

    End Try

    If Not parentObject Is Nothing Then
        Select Case cms.Text
            Case "Copy as Image"

                Dim ms As New System.IO.MemoryStream(100)

                parentObject.SaveImage(ms, ChartImageFormat.Bmp)

                Dim bm As Bitmap = New Bitmap(ms)
                Clipboard.SetImage(bm)

        End Select
    End If

End Sub

仍然认为应该使用ParentOwnerSourceControl

之类的解决方案。

答案 1 :(得分:0)

我的VB生锈了,但下面的代码对我来说很好。

Dim menu As New ContextMenuStrip()
menu.ItemClicked += New ToolStripItemClickedEventHandler(menu_ItemClicked)
menu.Items.Add("Save As Image")
chart1.ContextMenuStrip = menu
chart2.ContextMenuStrip = menu;

Private Sub menu_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs)
    If e.ClickedItem.ToString() = "Save As Image" Then
        Dim menu As ContextMenuStrip = TryCast(sender, ContextMenuStrip)
        If menu IsNot Nothing AndAlso menu.SourceControl IsNot Nothing Then
            Dim chart As Chart = TryCast(menu.SourceControl, Chart)
            Dim dlg As New SaveFileDialog()
            If chart IsNot Nothing AndAlso dlg.ShowDialog() = DialogResult.OK Then
                chart.SaveImage(dlg.FileName, ChartImageFormat.Jpeg)
            End If
        End If
    End If
End Sub