2012-06-20 79 views
2

我有一個DataGridView和右鍵單擊特定列時打開的上下文菜單。 上下文菜單中顯示的內容取決於單擊的字段中的內容 - 多個文件的路徑(操縱路徑以創建到正確文件的完整UNC路徑)。如何創建動態構建的上下文菜單clickEvent

唯一的問題是我無法獲得點擊工作。 我沒有從工具欄中拖放上下文菜單,我以編程方式創建它。

我想,如果我能得到的路徑(姑且稱之爲ContextMenuChosen)在MessageBox.Show(ContextMenuChosen);露面我可以在相同的設置System.Diagnostics.Process.Start(ContextMenuChosen);

的Mydgv_MouseUp事件低於實際工作的地步,我可以得到它當選擇了上下文菜單中的某些內容時,請將其關閉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

的方法,另外實現,您可以使用代替則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); 
}