SubItem из контекстного меню не предоставляет SourceControl, почему? - PullRequest
0 голосов
/ 15 февраля 2020

Прикрепленный пример кода становится динамическим - поле рисунка, сгенерированное текстовое поле, и каждому из них создано и назначено контекстное меню.

Контекстные меню содержат структуру с элементами на первом уровне, а также некоторые подпункты. , ContextMenuStrip.SourceControl должно быть определено при оценке событий меню. Это также работает для первого уровня структуры меню,

, а не подэлементов?

    Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim PB As New PictureBox With {.Name = "PB_Test", .BorderStyle = BorderStyle.Fixed3D,
                                        .Size = New Size(100, 150), .Location = New Point(20, 20)}
        Me.Controls.Add(PB)
        Dim TB As New TextBox With {.Name = "TB_Test", .Text = "testtext", .BorderStyle = BorderStyle.Fixed3D,
                                         .Location = New Point(20, PB.Top + PB.Height + 5)}
        Me.Controls.Add(TB)
        CMS_events(PB,, {"save", "Rotation|90° links|90° rechts|180°"})
        CMS_events(TB,, {"load", "Schrift|bold|italic|understrike"})
    End Sub
    Private Sub CMS_events(obj As Object, Optional e As EventArgs = Nothing, Optional MTxt As String() = Nothing)
        Dim cms As ContextMenuStrip,
            Tsmi As ToolStripMenuItem,
            aTxt As New List(Of String),
            par As Object,
            SC As Control,
            SCName As String
        If TypeOf obj Is Control Then
            With CType(obj, Control)
                If .ContextMenuStrip Is Nothing Then
                    cms = New ContextMenuStrip With {.Name = "CMS°" & obj.name}
                    For Each itxt In MTxt
                        aTxt = Split(itxt, "|").ToList
                        Tsmi = New ToolStripMenuItem(Split(itxt, "|")(0), Nothing, AddressOf CMS_events)
                        For sx = 1 To aTxt.Count - 1
                            Tsmi.DropDownItems.Add(sx & " " & aTxt(sx), Nothing, AddressOf CMS_events)
                        Next
                        cms.Items.Add(Tsmi)
                    Next
                    .ContextMenuStrip = cms
                End If
            End With
        ElseIf TypeOf obj Is ToolStripMenuItem Then
            par = obj
            Do While TypeOf par IsNot ContextMenuStrip
                If TypeOf par.owner Is ContextMenuStrip Then
                    par = par.owner
                    SC = CType(par, ContextMenuStrip).SourceControl
                    Exit Do
                ElseIf TypeOf par.owneritem Is ToolStripMenuItem Then
                    par = par.owneritem
                End If
            Loop
            Try
                SCName = SC.Name
            Catch ex As Exception
                SCName = "Nothing" & vbCrLf & ex.Message & vbCrLf & vbCrLf &
                         "hier ist das Problem:" & vbCrLf & vbCrLf &
                         vbTab & "es wird zwar das Contextmenustrip '" & par.name & "'" & vbCrLf &
                         vbTab & "erkannt, aber '.sourceControl = Nothing'" & vbCrLf & vbCrLf &
                         "!!! warum ???'"
            End Try
            MsgBox(TypeName(par) & " = " & par.name & vbCrLf &
                   TypeName(obj) & " = " & obj.text & vbCrLf & "in SC = " & SCName)
        End If
    End Sub
End Class
...