Как найти элемент toolstripitem, основанный на том, что его имя является переменной, а затем изменить его проверенное значение

0

Вопрос

У меня есть контекстное меню под названием: DGVContextStrip он отображается, когда пользователь щелкает правой кнопкой мыши на моем представлении данных.

Эта строка меню содержит элемент под названием AddUpgradeTagToolStripMenuItem который содержит подпункты(раскрывающиеся элементы), все эти подпункты имеют имена с номером в их названии. напр.: Add1ToolStripMenuItem, Add2ToolStripMenuItem, Add3ToolStripMenuItem.... и так далее, пока Add25ToolStripMenuItem.

Когда пользователь щелкает правой кнопкой мыши на представлении Datagrid, я хочу проверить, содержит ли ячейка число "1", а затем, если это действительно так Add1ToolStripItem.checked = true

Я решил, что буду перебирать числа от 1 до 25 и в каждом цикле проверять, содержит ли ячейка 1, и если верно, измените проверенное значение пункта меню. что-то вроде...

For i = 1 to 25
  If DataGridView1.SelectedRows(0).Cells("Text_Field").Value.ToString.Contains(i) then
  CType("Add" & i & "ToolStripMenuItem", ToolStripMenuItem).Checked = True

Next

но это не работает, я видел в Интернете примеры, в которых используется этот элемент управления.найдите метод, но я не смог заставить его работать для моего использования. например

Dim ControlName As String = "Add" & i & "ToolStripMenuItem"
CType(Me.Controls.Find(ControlName, True), ToolStripMenuItem).Checked = True

есть идеи, как мне заставить это работать? Я понимаю, что мог бы использовать 25 операторов if then else, но я вроде как хотел, чтобы код был намного аккуратнее.

1

Лучший ответ

1

То ToolStripItem не является элементом управления для поиска одного из них в Control.ControlCollection. Вам нужно найтиToolStripItemCollection где ему и место.

Так же, как и Control.ControlCollection.Find способ, тоToolStripItemCollection.Find метод может выполнять глубокий поиск элемента.

Примеры для вашего случая:

Dim itemName As String = $"Add{i}ToolStripMenuItem"
Dim tsmi = yourContextMenuStrip.Items.
    Find(itemName, True).
    OfType(Of ToolStripMenuItem).
    FirstOrDefault()

If tsmi IsNot Nothing Then
    tsmi.Checked = True
End If

В качестве альтернативы, если вы уже знаете, что целевой элемент является одним из AddUpgradeTagToolStripMenuItem выпадающие элементы, затем вы можете сделать:

Dim itemName As String = $"Add{i}ToolStripMenuItem"
Dim tsmi = DirectCast(AddUpgradeTagToolStripMenuItem, ToolStripMenuItem).
    DropDownItems.OfType(Of ToolStripMenuItem).
    FirstOrDefault(Function(x) x.Name.Equals(itemName, StringComparison.OrdinalIgnoreCase))

If tsmi IsNot Nothing Then
    tsmi.Checked = True
End If

В случае, если вам нужно проверить только один предмет из коллекции:

Dim itemName As String = $"Add{i}ToolStripMenuItem"

For Each tsmi In DirectCast(AddUpgradeTagToolStripMenuItem, ToolStripMenuItem).
    DropDownItems.OfType(Of ToolStripMenuItem)

    If tsmi.Name.Equals(itemName, StringComparison.OrdinalIgnoreCase) Then
        tsmi.Checked = True
    Else
        tsmi.Checked = False
    End If
Next
2021-11-12 18:27:29

спасибо , ваш первый вариант сработал для меня. На самом деле я не смог заставить работать второй вариант, он просто не компилировался, имейте в виду, что Visual Studio не распознала никаких ошибок в коде, поэтому я не уверен, почему он не компилировался.
Andy Andromeda

@AndyAndromeda, пожалуйста. Что касается ошибки второго варианта, я не знаю. Это работает на меня.
dr.null

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................