prüfen im ContextMenuStrip, ob Item existiert

07/06/2010 - 13:02 von Alexander Richter | Report spam
Hallo,
ich erstelle zur Laufzeit ein Kontextmenü mit ContextMenuStrip.
In diesem will ich prüfen, ob ein bestimmter Menüpunkt existiert.
Find gibt mir ein Array mit 0 zurück und IndexOf gibt -1 zurück.
Warum? Mit einer foreach-Schleife finde ich den Eintrag!

object[] itemFound = contextMenuStrip.Items.Find("Eintrag 1",true);
Console.WriteLine(itemFound.Length);
//gibt 0 aus

if (contextMenuStrip.Items.IndexOf(contextMenuStrip.Items["Eintrag 1"])
== -1) {
Console.WriteLine("fehlt");
//"fehlt" wird ausgegeben, obwohl "Eintrag 1" existiert
}



Alexander
 

Lesen sie die antworten

#1 Frank Dzaebel
08/06/2010 - 07:20 | Warnen spam
Hallo Alexander,

ich erstelle zur Laufzeit ein Kontextmenü mit ContextMenuStrip.
In diesem will ich prüfen, ob ein bestimmter Menüpunkt existiert.
Find gibt mir ein Array mit 0 zurück [...]



"Find" sucht anhand des Namens und nicht anhand der Text-Eigenschaft:

[ToolStripItemCollection.Find-Methode (System.Windows.Forms)]
http://msdn.microsoft.com/de-de/lib....find.aspx

Normal haben die MenuItems aber auch alle einen Namen.
Man geht dann normal einfach über diesen direkt. Sie
heißen vielleicht etwa so:

eintrag1ToolStripMenuItem.Name

Das ist auch viel besser, wenn man zum Beispiel
einmal die Text-Eigenschaft àndert.



und IndexOf gibt -1 zurück.
Warum? [...] contextMenuStrip.Items.Find("Eintrag 1",true);
Console.WriteLine(itemFound.Length); //gibt 0 aus



auch hier das gleiche. Die Items werden über den Namen
als Schlüssel indiziert. Wie auch sonst, schliesslich
könnten ja zwei Items auch den gleichen Text (vielleicht in
einem SubMenu) haben.

Wenn man trotzdem unbedingt über die Text Eigenschaft
suchen will/muss, kann man zum Beispiel etwas wie folgendes nehmen:

var eintrag1 = contextMenuStrip1.Items.Cast<ToolStripItem>().
Where(m => m.Text == "Eintrag 1").FirstOrDefault();


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen