0

У меня есть форма с многочисленными графиками и добавили 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 

Тогда я бы например, чтобы определить, на какую диаграмму щелкнул, чтобы я мог скопировать этот график в буфер обмена. Это кажется простой проблемой для меня, но я не могу понять, почему независимо от того, что я пытаюсь идентифицировать, Owner, Parent, SourceControl меню правой кнопки мыши всегда возвращает мне значение Nothing.

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

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

    Dim _owner As Control = CType(cms.SourceControl, Chart) 

    Select Case menuItem.Text 
     Case "Copy as Image" 

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

      _owner.SaveImage(ms, ChartImageFormat.Bmp) 

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

    End Select 
End Sub 

Любые идеи, как определить исходный график?

+0

возможно дубликат [нуль ContextMenuStrip.Owner свойств при получении от вложенной ToolStripMenuItem] (http://stackoverflow.com/questions/12094528/contextmenustrip-owner-property-null-when-retrieving-from-nested- toolstripmenuit) – LarsTech

+0

все еще получает 'menuSource = (CType (sender, ContextMenuStrip)). SourceControl'' 'ничего 'не использует это решение – TylerDurden

ответ

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 

Тем не менее думает, что там должна быть простым решением, чем это с помощью подобные Parent, Owner и SourceControl

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 
+0

Я вижу нулевой SourceControl с таким подходом –

Смежные вопросы