2014-09-02 5 views
0

Итак, у меня есть базовый макет, где я заполняю элемент подменю contextMenu с предустановленными элементами. Я пытаюсь найти «индекс» выбранного выбранного подменю. Какой метод существует для этого? Я нашел метод, чтобы найти индекс пунктов главного меню, но не элементы подменю.C# find index of contextSubMenu item clicked

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

Использование этого для поиска продукта из списка. Таким образом, 3-й элемент в списке предустановок contextMenu будет третьим элементом в списке хранимых переменных. – 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

нет субменюItem click event, которое может поймать отправителей или индекс e.click? – JokerMartini