Come trovare un toolstripitem in base al suo nome essendo una variabile e quindi modificare il valore selezionato di

0

Domanda

Ho un ContextMenuStrip chiamato: DGVContextStrip visualizzato quando l'utente facendo clic destro sul mio datagridview.

Che MenuStrip contiene un elemento chiamato AddUpgradeTagToolStripMenuItem che contiene gli elementi sub(dropdownitems), questi sub elementi sono tutti chiamato con un numero in loro nome. ad esempio: Add1ToolStripMenuItem, Add2ToolStripMenuItem, Add3ToolStripMenuItem.... e così via fino a quando Add25ToolStripMenuItem.

Quando un utente facendo clic destro sul Datagridview, voglio controllare se una cella contiene il numero "1", quindi se lo fa fare Add1ToolStripItem.checked = true

Ho pensato che sarebbe loop attraverso i numeri da 1 a 25, e in ogni ciclo di verificare se la cella contiene 1 e se è vero, modificare il valore selezionato della voce di menu. qualcosa di simile...

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

ma questo non funziona, iv visto esempi online che utilizzano il controllo.metodo di ricerca ma non ho potuto ottenere che lavorare per il mio uso. per esempio

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

tutte le idee su come ottenere questo lavoro? Mi rendo conto che avrei potuto usare 25 istruzioni if then else, ma ho voluto mantenere il codice pulito.

1

Migliore risposta

1

Il ToolStripItem non è un controllo per la ricerca di un in un Control.ControlCollection. È necessario per la ricerca di un ToolStripItemCollection in cui esso appartiene.

Proprio come il Control.ControlCollection.Find metodo, il ToolStripItemCollection.Find metodo in grado di eseguire una profonda ricerca di un elemento.

Esempi per il tuo caso:

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

In alternativa, se si sa già che l'elemento di destinazione è uno dei AddUpgradeTagToolStripMenuItem discesa elementi, allora si può fare:

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

Nel caso In cui avete bisogno di controllare solo un oggetto da collezione:

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

grazie , la tua prima opzione ha funzionato per me. Io in realtà non riuscivo a ottenere la seconda opzione, è semplice non compilare mente è Visual Studio non ha rilevato alcun errore nel codice, quindi non sono sicuro perché non sarebbe compilare.
Andy Andromeda

@AndyAndromeda sei il benvenuto. Come per la seconda opzione di errore, non so. A me funziona.
dr.null

In altre lingue

Questa pagina è in altre lingue

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