2012-06-20 2 views
2

У меня есть DataGridView и контекстное меню, которое открывается при щелчке правой кнопкой мыши по определенному столбцу. То, что отображается в контекстном меню, зависит от того, что находится в выбранном поле - пути к нескольким файлам (пути управляются для создания полного пути UNC к правильному файлу).Как создать динамически построенное контекстное меню clickEvent

Единственная проблема в том, что я не могу заставить щелчок работать. Я не перетащил контекстное меню с панели инструментов, я создал его программно.

Я понял, что если я могу получить путь (назовем его ContextMenuChosen), чтобы показать в MessageBox.Show(ContextMenuChosen); я мог установить то же самое System.Diagnostics.Process.Start(ContextMenuChosen);

Событие Mydgv_MouseUp ниже фактически работает до точки, где я могу получить его fire off MessageBox.Show("foo!");, когда что-то в контекстном меню выбрано, но оно заканчивается. Я оставил в кучу комментариев ниже, показывая, что я пробовал, когда на него нажимают один из путей. Некоторые результат в пустых строках, другие ошибки (объект не установлен в экземпляр ...).

Я искал код вчера днем, но не смог найти другой способ подключить динамически построенное контекстное меню clickEvent.

код и комментарии:

ContextMenu m = new ContextMenu(); 

    // SHOW THE RIGHT CLICK MENU 
    private void Mydgv_MouseClick(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      int currentMouseOverCol = Mydgv.HitTest(e.X, e.Y).ColumnIndex; 
      int currentMouseOverRow = Mydgv.HitTest(e.X, e.Y).RowIndex; 

      if (currentMouseOverRow >= 0 && currentMouseOverCol == 6) 
      { 
       string[] paths = myPaths.Split(';'); 
       foreach (string path in paths) 
       { 
        string UNCPath = "\\\\1.1.1.1\\c$\\MyPath\\"; 
        string FilePath = path.Replace("c:\\MyPath\\", @""); 
        m.MenuItems.Add(new MenuItem(UNCPath + FilePath)); 
       } 
      } 
      m.Show(Mydgv, new Point(e.X, e.Y)); 
     } 
    } 



    // SELECTING SOMETHING IN THE RIGHT CLICK MENU 
    private void Mydgv_MouseUp(object sender, MouseEventArgs e) 
    { 
     DataGridView.HitTestInfo hitTestInfo; 
     if (e.Button == MouseButtons.Right) 
     { 
      hitTestInfo = Mydgv.HitTest(e.X, e.Y); 
      // If column is first column 
      if (hitTestInfo.Type == DataGridViewHitTestType.Cell && hitTestInfo.ColumnIndex == 6) 
      { 
       //MessageBox.Show(m.ToString()); 
       ////MessageBox.Show(m.Tag.ToString()); 
       //MessageBox.Show(m.Name.ToString()); 
       //MessageBox.Show(m.MenuItems.ToString()); 
       ////MessageBox.Show(m.MdiListItem.ToString()); 
       // MessageBox.Show(m.Name); 
       //if (m.MenuItems.Count > 0) 
       //MessageBox.Show(m.MdiListItem.Text); 
       //MessageBox.Show(m.ToString()); 
       //MessageBox.Show(m.MenuItems.ToString()); 
       //Mydgv.ContextMenu.Show(m.Name.ToString()); 
       //MessageBox.Show(ContextMenu.ToString()); 
       //MessageBox.Show(ContextMenu.MenuItems.ToString()); 
       //MenuItem.text 
       //MessageBox.Show(this.ContextMenu.MenuItems.ToString()); 

      } 

      m.MenuItems.Clear(); 
     } 

    } 

Я очень близок к завершению этого так что любая помощь будет оценена.

ответ

3

Я не вижу обработчик события подключается к вашему пункту меню, так что что-то произойдет, когда вы щелкните по нему:

void menu_Click(object sender, EventArgs e) { 
    MessageBox.Show(((MenuItem)sender).Text); 
} 

Затем приложите его, когда вы добавляете пункт меню в контекстном меню:

MenuItem mi = new MenuItem(UNCPath + FilePath); 
    mi.Click += menu_Click; 
    m.MenuItems.Add(mi); 
+0

LarsTech, он работал совершенно отлично, спасибо так много. – Chris

+0

функция menu_click должна возвращать «EventHandler»? – sparkyShorts

+1

@sparkyShorts Нет, события сопоставляются с методами. В этом случае событие click сопоставляется для запуска метода menu_Click каждый раз, когда в элементе меню создается клик. 'mi.Click + = menu_Click;' коротко для 'mi.Click + = new EventHandler (menu_Click);' – LarsTech

0

Вы можете обращаться с CellMouseDown как это когда вы, когда вы right click a cell of a specific column. Конкретная колонка достигается e.ColumnIndex check

Aditionally, вы можете использовать вместо HitTest

ContextMenu cm = new ContextMenu(); 

void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 

     if (e.ColumnIndex == 0) 
     { 
      cm.MenuItems.Clear(); 
      var mi = new MenuItem("C:\temp"); 
      mi.MenuItems.Add(mi); 
      // handle menu item click event here [as required] 
      mi.Click += OnMenuItemClick; 
      cm.MenuItems.Add(0, mi); 
      var bounds = dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false); 
      if (sender != null) 
      { 
       cm.Show(sender as DataGridView, new Point(bounds.X, bounds.Y)); 
      } 
     } 
    } 
} 

void OnMenuItemClick(object sender, EventArgs e) 
{ 
     MessageBox.Show(((MenuItem)sender).Text); 
} 
Смежные вопросы