2014-09-02 4 views
0

기본 레이아웃이있어서 기본 설정 항목이있는 contextMenu의 하위 메뉴 항목을 채 웁니다. 선택한 하위 메뉴 항목의 '색인'을 찾으려고합니다. 이것을 위해 어떤 방법이 있습니까? 주 메뉴 항목의 색인을 찾는 방법을 찾았지만 하위 메뉴 항목은 찾지 못했습니다.C# contextSubMenu 항목의 인덱스를 찾았습니다.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace rcMenu 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 

      Product newProductA = new Product(); 
      newProductA.Name = "Ice Cream"; 
      newProductA.Category = "Dessert"; 
      newProductA.Price = "Free"; 
      productList.Add(newProductA); 

      Product newProductB = new Product(); 
      newProductB.Name = "Cherries"; 
      newProductB.Category = "Produce"; 
      newProductB.Price = "$10.00"; 
      productList.Add(newProductB); 

      Product newProductC = new Product(); 
      newProductC.Name = "Soda"; 
      newProductC.Category = "Beverage"; 
      newProductC.Price = "$1.99"; 
      productList.Add(newProductC); 
     } 

     public static List<Product> productList = new List<Product>(); 

     public class Product 
     { 
      public String Name { get; set; } 
      public String Category { get; set; } 
      public String Price { get; set; } 
     } 

     private void contextMenuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e) 
     { 
      //works only for main menu items 
      int index = contextMenuStrip1.Items.IndexOf(e.ClickedItem) 

      //need index of submenu ITEM CLICKED?? 
     } 

     private void contextMenuStrip1_Opening(object sender, EventArgs e) 
     { 
      (contextMenuStrip1.Items[0] as ToolStripMenuItem).DropDownItems.Clear(); 

      foreach (var p in productList) 
      { 
       var itemName = p.Name; 
       (contextMenuStrip1.Items[0] as ToolStripMenuItem).DropDownItems.Add(itemName, null, SelectedPreset); 
      } 
     } 
    } 
} 
+0

당신은 인덱스 자체가 필요하십니까? 아니면 그냥 제품을 검색하는 데 사용하고 있습니까? –

+0

목록에서 제품을 조회하는 데 사용합니다. 따라서 contextMenu 프리셋 목록의 세 번째 항목은 List에 저장된 변수의 세 번째 항목입니다. – JokerMartini

+0

@DJKRAZE이 게시물을 게시하기 전에 참조하고있는 게시물을 살펴본 결과 'SubmenuItem_Click'을 사용하여 그의 결과를 조사 할 때 어떤 정보도 찾을 수 없다는 것을 알았습니다. – JokerMartini

답변

2

다음을 수행 할 수 있습니다.

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) 
    { 
     (contextMenuStrip1.Items[0] as ToolStripMenuItem).DropDownItems.Clear(); 
     (contextMenuStrip1.Items[0] as ToolStripMenuItem).DropDownItemClicked -= DropDownItemClicked; 
     (contextMenuStrip1.Items[0] as ToolStripMenuItem).DropDownItemClicked += DropDownItemClicked; 


     foreach (var p in productList) 
     { 
      var itemName = p.Name; 
      (contextMenuStrip1.Items[0] as ToolStripMenuItem).DropDownItems.Add(itemName, null, SelectedPreset); 
      } 
    } 

    private void DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) 
    { 
     var parent = (ToolStripMenuItem)sender; 

     int index = parent.DropDownItems.IndexOf(e.ClickedItem); 
     Debug.WriteLine(index); 
    } 

그러나 더 나은이 작업을 수행합니다 :

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) 
    { 
     (contextMenuStrip1.Items[0] as ToolStripMenuItem).DropDownItems.Clear(); 

     foreach (var p in productList) 
     { 
      var itemName = p.Name; 
      var item = (contextMenuStrip1.Items[0] as ToolStripMenuItem).DropDownItems.Add(itemName, null, SelectedPreset); 
      item.Tag = p; 
     } 
    } 


    private void SelectedPreset(object sender, EventArgs e) 
    { 
     var menuItem = (ToolStripItem)sender; 
     Debug.WriteLine(((Product)menuItem.Tag).Name); 
    } 
+0

우승자! 굉장해. 감사 – JokerMartini

0

추가 :

public class Product 
{ 
    // : 
    public override string ToString() { return Name; } 
} 

다음 contextMenuStrip1_Opening 저장소의 전체 개체 만이 아니라 이름입니다.

private void contextMenuStrip1_Opening(object sender, EventArgs e) 
    { 
     var ddi = (contextMenuStrip1.Items[0] as ToolStripMenuItem).DropDownItems; 
     ddi.Clear(); 

     foreach (var p in productList) 
     { 
      ddi.Add(p, null, SelectedPreset); 
     } 
    } 
+0

보낸 사람 또는 e.click 색인을 catch 할 수있는 submenuItem click 이벤트가 없습니다? – JokerMartini

관련 문제