Simonetos The Greek Ответов: 2

Как я могу использовать для каждого цикла несколько контекстных меню?


Есть любой способ использовать для каждого петля с несколько контекстных меню контроль?

Что я уже пробовал:

Я хочу сделать что-то вроде приведенного ниже примера...
For Each lbl As Label In Me.Controls
    'Some code here...
Next

Но для элементов управления ContextMenu...
For Each cmenu As ContextMenu In ???

2 Ответов

Рейтинг:
2

Pete O'Hanlon

Если я правильно помню, каждое контекстное меню связано с определенным элементом управления, поэтому, чтобы получить контекстное меню, вам все равно нужно перебрать элементы управления, а затем проверить каждый элемент управления, чтобы увидеть, есть ли у него Контекстменю, связанное с ним или нет (т. е. Контекстменю-это ничто).


Simonetos The Greek

Ты имеешь в виду что-то вроде этого?

For Each FlowLayoutPanel As FlowLayoutPanel In Me.Controls
    For Each lbl As Label In FlowLayoutPanel.Controls
       If lbl.Name = "Blah Blah" Then
          For Each CMenu As ContextMenu In lbl.Controls
             'Code Here
          Next
       End If
    Next
 Next

Потому что ContextMenu появляется, когда я нажимаю на метку?

Pete O'Hanlon

Если бы я делал это (извините, но это C#), это выглядело бы примерно так:

private void IterateOverControl(ControlCollection controls)
{
  if (controls == null) return;
  foreach (Control control in controls)
  {
    IterateOverControl(control.Controls);
    if (control.ContextMenu != null)
    {
      // Do something here because I know I have a context menu.
    }
  }
}
Затем вы можете назвать это по:
IterateOverControls(this.Controls);
Это должно быть простым делом для вас, чтобы перевести это на VB.NET-да.

Simonetos The Greek

Я преобразовал его в VB.NET но я не могу заставить его работать... Сейчас я пытаюсь сделать несколько вещей.

Рейтинг:
13

Simonetos The Greek

Вот рабочее решение, как я его получил от stackoverflow.com здесь:

Если вы используете класс ContextMenuStrip, который заменяет и добавляет функциональность элементу управления ContextMenu предыдущих версий, вы можете использовать аналогичный код:

For Each x As Object In Me.components.Components
    If TypeOf x Is ContextMenuStrip Then
        MsgBox(CType(x, ContextMenuStrip).Name)
    End If
Next x
Вам нужно использовать отражение, чтобы найти каждый ContextMenuStrip в коллекции открытых форм, принадлежащих приложению.
For Each frm As Form In My.Application.OpenForms
    For Each fi As System.Reflection.FieldInfo In frm.GetType.GetFields(
        System.Reflection.BindingFlags.NonPublic Or _
        System.Reflection.BindingFlags.Instance Or _
        System.Reflection.BindingFlags.DeclaredOnly)
        If fi.FieldType Is GetType(ContextMenuStrip) Then
            MsgBox(frm.Name & " - " & TryCast(fi.GetValue(frm), ContextMenuStrip).Name)
        End If
    Next fi
Next frm
И в случае, если мы используем MetroContextMenu контроль, мы должны заменить каждый:
ContextMenuStrip
к:
MetroFramework.Controls.MetroContextMenu