2010-01-18 16 views
6

Ben öğeler dolu bir MenuStrip varsa ve olayla ilgili hepsi subscribe sahip çalışıyorum bu yüzden menuStrip1.Items.OfType<ToolStripMenuItem>(); yapmaya çalışıyorum ve her biri için bunu yapmak:C# - Kullanım OfType ve kalıtsal görmezden sınıflar

menuitem.Click += new EventHandler(MenuItem_Click); 

Sorun, ToolStripMenuItem öğesini devralan bir ToolStripSeperatorItem var ve bu bir Click olayı olmadığı için öğelerim ve hatalarımın listesidir.

Bunları OfType yöntemimde nasıl ekleyemiyorum? Belki böyle

+3

ToolStripSeperatorItem ToolStripMenuItem uzanır ve ToolStripMenuItem ardından ToolStripSeperatorItem * zorunluluk bir Click olayı varsa * Bir Click olayı da var mı? – dtb

+4

BTW .NET framework'te ToolStripSeperatorItem yoktur ve ToolStripSeperator ToolStripItem ToolStripMenuItem'i genişletir. – dtb

cevap

8
menuStrip1.Items.OfType<ToolStripMenuItem>().Where(it => it.GetType() == typeof(ToolStripMenuItem)); 

Biraz gereksiz görünüyor, ancak her iki yaparak, dönüş türü korumak.

3
menuStrip1.Items.OfType<ToolStripMenuItem>() 
       .Where(i => i.GetType() == typeof(ToolStripMenuItem)) 
+0

Öğeler burada bir yöntem yok – Jon

+0

Haklısınız. 'Items' koleksiyonu sadece IEnumerable ' değil 'IEnumerable'ı uygular, bu yüzden hala orada da OfType' aramasına ihtiyacımız var. – LukeH

2

:

menuStrip1.Items 
    .OfType<ToolStripMenuItem>() 
    .Except(menuStrip1.Items.OfType<ToolStripSeparatorItem>()) 
0
menuStrip1.Items 
.Cast<ToolStripMenuItem>() 
.Where(i => i.GetType() == typeof(ToolStripSeparatorItem)); 

, Cast ile açık döküm sonra temelde yavaş örtük bir oyuncu ve karşılaştırılması (OfType) gerekmez Çünkü