Dropdown items verwijderen

Status
Niet open voor verdere reacties.

The Mighty Atom

Terugkerende gebruiker
Lid geworden
22 mei 2008
Berichten
1.380
Ik krijg het volgende niet voor elkaar.

Ik heb dit:

menuitems.jpg


Je ziet een menustrip met met een menuitem genaamd Profiles. Daaronder heb ik een aantal dropdownitems.

Nou is het de bedoeling dat ik als ik bijvoorbeeld Item 3 in de TextBox invul en dan op de knop druk, dat dropdownitem met de text Item 3 verwijderd moet worden. De code die ik daarvoor dacht te gebruiken is:

Code:
        ProfilesToolStripMenuItem.DropDownItems.Remove(TextBox1.Text)

Maar dit geeft bij designtime een error:

Value of type 'String' cannot be converted to 'System.Windows.Forms.ToolStripItem'

Hoe kan ik nou de naam van het item laten verwijderen die ik in de textbox heb ingevuld? Ik vermoed dat je een één of andere conversie moet uitvoeren, maar op dat gebied ben ik nog niet zo gevorderd. Wie kan mij helpen?
 
Je zou het bv zo kunnen doen:

Code:
Dim objToRemove As System.Windows.Forms.ToolStripItem  = ProfilesToolStripMenuItem.DropDownItems.Item(Me.TextBox1.Text)
ProfilesToolStripMenuItem.DropDownItems.Remove(objToRemove)
 
Hmmm, jouw code geeft geen error tijdens runtime, maar er lijkt niks te gebeuren, de naam van de dropdownitem die ik heb ingevuld in de textbox blijft gewoon staan.

Ik heb effe gedebugged en blijkt dat de variable objToRemove geen waarde krijgt toegewezen. De waarde blijft Nothing.

Wat nu?
 
Laatst bewerkt:
Da's apart, je hebt gelijk. Ik zal zo eens kijken.
 
Hij deed het hier toch wel, ik had alleen het verkeerde menu-niveau gebruikt. Ik heb nu:
- een MenuStrip, met daaraan een MenuToolStripMenuItem, daaronder hangen:
DD1ToolStripMenuItem
DD2ToolStripMenuItem
Een textbox Textbox1


Omdat ik een beetje moet werd van het intypen van de controlnaam heb ik die even in de code gezet, en om te debuggen heb ik objRemove op een andere regel gezet dan de declaratie.
Code:
Dim objToRemove As System.Windows.Forms.ToolStripItem
'just so we don't have to type it over and over...
Me.TextBox1.Text = "DD2ToolStripMenuItem"

'currently there are 2 items
Debug.Print(Me.MenuToolStripMenuItem.DropDownItems.Count)

'objRemove contains a link now to the menu that we want to delete
objToRemove = Me.MenuToolStripMenuItem.DropDownItems.Item(Me.TextBox1.Text)

Me.MenuToolStripMenuItem.DropDownItems.Remove(objToRemove)

'currently there is 1 item
Debug.Print(Me.MenuToolStripMenuItem.DropDownItems.Count)

Eventueel kan ik je de form wel mailen, zal hier wel niet gaan passen.
 
Eventueel kan ik je de form wel mailen, zal hier wel niet gaan passen.

Als dat zou kunnen, graag, dat maakt het bestuderen van jouw code net wat makkelijker. :) Alle beetjes helpen.

Mail maar naar:
mail.gif


Edit: heel vreemd, maar er gebeurt nog altijd niks. Er verdwijnt geen enkel item. :(
Edit2: objToRemove krijgt nog steeds geen waarde toegewezen en blijft dus op Nothing staan.
 
Laatst bewerkt:
Bleek achteraf mee te vallen in grootte; ik heb één project waar ik al m'n testjes in stop (altijd makkelijk voor later) en deze was nogal groot. Maar op een zelfstandig project valt het wel mee, dus ik post 'm hier ook nog maar even.
 

Bijlagen

  • TMA.rar
    46,6 KB · Weergaven: 25
Bedankt man, het werkt.

Maar.

Ik zie dat je kijkt naar de name van het menu item, niet naar de eigenlijke text. Kan ik ook op text zoeken?

Dus, als ik de text van een menu item invul, dat die dan verwijderd wordt? Dat komt me net wat beter uit eigenlijk... Maar als dat niet mogelijk is dan voldoet jouw voorbeeld prima. :thumb:
 
Ik denk dat je dan een loopje moet maken en moet kijken of dit item gelijk is:

Code:
if Me.MenuToolStripMenuItem.DropDownItems.Item(i).Text = me.TextBox1.Text then
   'gevonden!
   objItemToRemove = Me.MenuToolStripMenuItem.DropDownItems.Item(i)
end if
 
Ik probeerde een For Each loop te gebruiken en als deze een item tegen kwam waavan de text klopt met text die is opgegeven in de textbox dat tie dan verwijderd moet worden, maar dan krijg ik een error omdat de collectie gewijzigd is.

Hoe moet ik dit in godsnaam aanpakken, want de menu items waar het om gaat worden via code gemaakt, en deze items krijgen name waarde. Dat is waarom ik dus niet om name kan checken, maar alleen op text.

Edit: volgens mij heb ik het:
Code:
        Dim objToRemove As ToolStripItem = MenuToolStripMenuItem.DropDownItems.Item(TextBox1.Text)

        For Each objToRemove In MenuToolStripMenuItem.DropDownItems

            If objToRemove.Text = TextBox1.Text Then
                MenuToolStripMenuItem.DropDownItems.Remove(objToRemove)
                Exit For
            End If

        Next

Doe ik het zo goed?
 
Laatst bewerkt:
Gebruik een for next loop waarbij je van boven naar beneden telt:

Code:
'uiteraard de juiste naam van de collection, maar dat snap je wel
for i = object.count-1 to 0 step -1  
  'blahblah
next
 
Eigenlijk is het de bedoeling dat je meerdere items met in klik kan verwijderen, maar dat wordt me te ingewikkeld, dus laat dat maar zitten, het is goed zo. :)

Dank voor je hulp! :thumb:
 
You're welcome. Maar hoe had je dat aanklikken in gedachten zitten dan? (Niet zo gauw opgeven haha)
 
Nou, zie het zo voor je:

Ik heb een form. Op dat form is een listbox. Met knop voeg je items toe aan de listbox, en tegelijkertijd wordt er ook een menuitem gemaakt met dezelfde text op een ander form.

Als je nou een item in de listbox verwijderd, moet ook de bijbehorende menuitem op het andere form ook verwijderd worden. Tot nu toe lukt dit, dankzij jouw code. Maar ik kan alleen één item tegelijk selecteren en die verwijderen. Als ik de SelectionMode property van listbox op MultiExtended instel, kan je dus meerdere items selecteren. Als ik dan op de delete knop zou drukken, zouden alle items in de listbox verwijderd worden plus de bijbehorende menuitems op het andere forum.

Nou weet ik wel hoe je meerderen geselecteerde items uit een listbox kan verwijderen, zo dus:

Code:
        For i = 0 To lbProfiles.SelectedItems.Count - 1
            lbProfiles.Items.Remove(lbProfiles.SelectedItems(i))
        Next

Maar ik zou niet weten hoe ik dat kan laten samenwerken met de menuitems.

Hier zie je hoe ik de listbox vul en tegelijkertijd een menuitem aanmaak:

Code:
                lbProfiles.Items.Add(tbProfileName.Text)
                frmMain.ProfilesToolStripMenuItem.DropDownItems.Add(tbProfileName.Text, Nothing, New EventHandler(AddressOf frmMain.ProfileClick))

Die EventHandler is voor een click event voor de gemaakte menuitems (of moet ik zeggen dropdownitems) zodat ik hun text property kan opvragen.
 
Kun je 'm even mailen? Je hebt als het goed is die andere file van me gehad, dus je hebt m'n adres. Ben even benieuwd :)
 
Ja, maar het is een enorm project. Ik zal ff een nieuwe project maken met alleen die objecten.

Edit: Je hebt mail.
Edit2: Het is helemaal gelukt! :D
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan