2010-01-18 38 views
6

Tôi có một MenuStrip với rất nhiều các mặt hàng và đang cố gắng để có về sự kiện tất cả họ đều Theo dõi vì vậy tôi đang cố gắng để làm menuStrip1.Items.OfType<ToolStripMenuItem>(); và cho mỗi một tôi làm điều này:C# - Sử dụng OfType và bỏ qua kế thừa lớp

menuitem.Click += new EventHandler(MenuItem_Click); 

Vấn đề là có một ToolStripSeperatorItem kế thừa ToolStripMenuItem và xuất hiện là danh sách các mục và lỗi của tôi vì nó không có sự kiện Click.

Làm cách nào để không bao gồm những thứ này trong phương pháp OfType của tôi?

+3

Nếu ToolStripSeperatorItem kéo dài ToolStripMenuItem, và ToolStripMenuItem có một sự kiện Click, sau đó ToolStripSeperatorItem * phải * có một sự kiện Click là tốt, không? – dtb

+4

BTW không có ToolStripSeperatorItem trong .NET framework, và ToolStripSeperator mở rộng ToolStripItem không phải ToolStripMenuItem. – dtb

Trả lời

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

Có vẻ như loại dư thừa, nhưng bằng cách làm cả hai, bạn duy trì kiểu trả về.

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

Các mục không có Phương thức ở đâu – Jon

+0

Bạn nói đúng. Bộ sưu tập 'Items' chỉ thực hiện 'IEnumerable', không phải là' IEnumerable ', vì vậy chúng ta vẫn cần gọi 'OfType' trong đó. – LukeH

2

Có lẽ như thế này:

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

Bởi vì bạn không cần một diễn viên tiềm ẩn và so sánh (OfType) mà về cơ bản là chậm hơn sau đó diễn viên rõ ràng với Cast

Các vấn đề liên quan