Jak znaleźć element toolstripitem, bazując na tym, że jego nazwa jest zmienną, a następnie zmienić jego sprawdzona wartość

0

Pytanie

Mam menu kontekstowe pod nazwą: DGVContextStrip jest on wyświetlany, gdy użytkownik kliknie prawym przyciskiem myszy na moim widoku danych.

Ten pasek menu zawiera element o nazwie AddUpgradeTagToolStripMenuItem który zawiera poddziałania(rozwijane elementy), wszystkie te punkty mają nazwy z numerem w ich tytule. np.: Add1ToolStripMenuItem, Add2ToolStripMenuItem, Add3ToolStripMenuItem.... i tak dalej, aż Add25ToolStripMenuItem.

Gdy użytkownik kliknie prawym przyciskiem myszy na widoku Datagrid, chcę sprawdzić, czy zawiera komórka liczba "1", a następnie, jeśli to rzeczywiście tak jest Add1ToolStripItem.checked = true

Postanowiłem, że będę grać numery od 1 do 25 i w każdym cyklu sprawdzić, czy zawiera komórka 1, a jeśli tak, zmień sprawdzona wartość pozycji menu. coś w rodzaju...

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

ale to nie działa, widziałem w Internecie przykłady, w których używany jest ten element zarządzania.znajdź metoda, ale nie byłem w stanie zmusić go do pracy dla mojego użytku. na przykład

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

jakieś pomysły, jak mam sprawić to działać? Rozumiem, że mogłeś użyć 25 instrukcji if then else, ale tak jakby chciał, aby kod był o wiele schludniej.

1

Najlepsza odpowiedź

1

To ToolStripItem nie jest elementem zarządzania wyszukiwania dla jednego z nich w Control.ControlCollection. Trzeba znaleźćToolStripItemCollection tam, gdzie jego miejsce.

Tak samo, jak i Control.ControlCollection.Find sposób na toToolStripItemCollection.Find metoda może wykonywać głębokie wyszukiwanie elementu.

Przykłady dla przypadku:

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

Alternatywnie, jeśli już wiesz, że docelowy jest jednym z AddUpgradeTagToolStripMenuItem rozwijane elementy, a następnie można zrobić:

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

W przypadku, gdy trzeba sprawdzić tylko jeden przedmiot z kolekcji:

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

dziękuję , twój pierwszy wariant zadziałał na mnie. Właściwie nie jestem w stanie zmusić do pracy druga opcja, to po prostu nie компилировался, należy pamiętać, że Visual Studio nie rozpoznaje żadnych błędów w kodzie, więc nie jestem pewien, dlaczego nie компилировался.
Andy Andromeda

@AndyAndromeda, proszę. Jeśli chodzi o błędy drugiej opcji, nie wiem. To działa na mnie.
dr.null

W innych językach

Ta strona jest w innych językach

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