Adının değişken olmasına bağlı olarak bir toolstripıtem nasıl bulunur ve ardından denetlenen değeri nasıl değiştirilir

0

Soru

Adında bir ContextMenuStrip var: DGVContextStrip kullanıcı datagridview'ime sağ tıkladığında görüntülenir.

Menustrip'in adı verilen bir öğe içerdiğini AddUpgradeTagToolStripMenuItem alt öğeleri(dropdownıtems) içeren bu alt öğelerin tümü adlarında bir sayı ile adlandırılır. örneğin: Add1ToolStripMenuItem, Add2ToolStripMenuItem, Add3ToolStripMenuItem.... ve benzeri kadar Add25ToolStripMenuItem.

Bir kullanıcı Datagridview üzerinde sağ tıkladığında, bir hücrenin "1" sayısını içerip içermediğini kontrol etmek istiyorum Add1ToolStripItem.checked = true

1'den 25'e kadar olan sayılarla döngü yapacağımı düşündüm ve her döngüde hücrenin 1 içerip içermediğini kontrol edin ve doğruysa, menü öğesinin işaretli değerini değiştirin. aşağı yukarı...

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

ancak bu işe yaramıyor, kontrolü kullanan çevrimiçi örnekleri gördüm.yöntem bul ama bunu kullanmam için çalıştıramadım. örneğin

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

bu işe nasıl bulurum bir fikriniz var mı? O zaman başka ifadeler kullanabilirsem 25 tane kullanabileceğimi fark ettim ama kodu daha düzgün tutmak istedim.

1

En iyi cevabı

1

Bu ToolStripItem bir kontrolde bir tane aramak için bir kontrol değil mi Control.ControlCollection. Aramanız gereken birToolStripItemCollection ait olduğu yere.

Tıpkı Control.ControlCollection.Find yöntemi ToolStripItemCollection.Find yöntem, bir öğe için derin bir arama gerçekleştirebilir.

Davanız için örnekler:

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

Alternatif olarak, hedef öğenin aşağıdakilerden biri olduğunu zaten biliyorsanız AddUpgradeTagToolStripMenuItem öğeleri bırakın, sonra şunları yapabilirsiniz:

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

Koleksiyondan yalnızca bir öğeyi kontrol etmeniz gerekiyorsa:

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

teşekkürler, ilk seçeneğin benim için işe yaradı. Aslında çalışmak için ikinci seçeneği bulamadım, basit bir şekilde derlemezsiniz, Visual Studio'nun kodda herhangi bir hata tanımadığını unutmayın, bu yüzden neden derlemeyeceğinden emin değilim.
Andy Andromeda

@ AndyAndromeda Rica ederim. İkinci seçeneğin hatasına gelince, bilmiyorum. Bu benim için çalışıyor.
dr.null

Diğer dillerde

Bu sayfa diğer dillerde

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