2012-03-14 2 views
3

DataGridView의 빈 부분을 마우스 오른쪽 버튼으로 클릭하면 (행이없는 눈금 부분을 클릭하면) 상황에 맞는 메뉴가 여전히 행 기반 옵션과 함께 나타납니다 . 클릭이 한 행 위로 넘어갈 때 문맥 메뉴 만 나타나게하려면 어떻게해야합니까?DataGrid의 빈 부분을 클릭 할 때 컨텍스트 메뉴가 나타나지 않도록합니다.

이것은 지금까지 내가 입수했습니다과 같습니다

private void f_context_select_row(object sender, MouseEventArgs e) 
    { 

      if (e.Button == MouseButtons.Right) 
      { 

       var hti = jobs_datagrid.HitTest(e.X, e.Y); 
       if (hti.RowIndex >= 0) 
       { 
        jobs_datagrid.ClearSelection(); 
        jobs_datagrid.Rows[hti.RowIndex].Selected = true; 
       } 
       else 
       { 
        //what can I do here to collapse the context menu? 
       } 
      } 

    } 

내가 프로그래밍 방식으로이 같은 데이터 격자 및 상황에 맞는 메뉴 건물입니다 :

    //on right click select row 
        jobs_datagrid.MouseDown += new MouseEventHandler(f_context_select_row); 

        //generate context menu 
        ContextMenuStrip m = new ContextMenuStrip(); 

        ToolStripMenuItem context_datagrid_run = new ToolStripMenuItem("Run All Selected Campaigns"); 
        ToolStripMenuItem context_datagrid_edit = new ToolStripMenuItem("Edit This Campaign"); 
        ToolStripMenuItem context_datagrid_delete = new ToolStripMenuItem("Delete This Campaign"); 
        context_datagrid_delete.Click += f_context_datagrid_delete; 
        context_datagrid_run.Click += f_run_selected_campaigns; 
        context_datagrid_edit.Click += f_context_datagrid_edit; 

        m.Items.Add(context_datagrid_delete); 
        m.Items.Add(context_datagrid_run); 
        m.Items.Add(context_datagrid_edit); 
        jobs_datagrid.ContextMenuStrip = m; 

        splitContainer3.Panel2.Controls.Add(jobs_datagrid); 
+0

어디서 [ContextMenu] Show() 메서드를 호출하고 있습니까? –

+0

컨텍스트 메뉴를 작성하는 방법에 대한 자세한 정보를 표시하도록 질문을 업데이트했습니다. 나는 어디서나 .show 이벤트가 있다고 생각하지 않는다. 저는 Visual C# Express로 작업하고 있습니다. – atwellpub

답변

8

무엇 ContextMenuStrip.Opening 이벤트에 대한 있습니까?

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) 
     { 
      var cms = sender as ContextMenuStrip; 
      var mousepos = Control.MousePosition; 
      if (cms != null) 
      { 
       var rel_mousePos = cms.PointToClient(mousepos); 
       if (cms.ClientRectangle.Contains(rel_mousePos)) 
       { 
        //the mouse pos is on the menu ... 
        //looks like the mouse was used to open it 
        var dgv_rel_mousePos = dataGridView1.PointToClient(mousepos); 
        var hti = dataGridView1.HitTest(dgv_rel_mousePos.X, dgv_rel_mousePos.Y); 
        if (hti.RowIndex == -1) 
        { 
         // no row ... 
         e.Cancel = true; 
        } 
       } 
       else 
       { 
        //looks like the menu was opened without the mouse ... 
        //we could cancel the menu, or perhaps use the currently selected cell as reference... 
        e.Cancel = true; 
       } 
      } 
     } 
0

그것은 내 솔루션 아니었지만 나는 ... 비슷한 문제로 DarkSquirrel42 대답 덕분에 솔루션을 가지고! :)

/// <summary> 
    /// Evento que permite ubicar la posicion del mouse y muestra el menu contextual. 
    /// </summary> 
    private void dgw_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      /*Obtener y seleccion celda donde se hizo el click*/ 
      DataGridView.HitTestInfo _htInfo = dgw.HitTest(e.X, e.Y); 
      dgw.CurrentCell = dgw[_htInfo.ColumnIndex, _htInfo.RowIndex]; 

      //Invocar evento de apertura de Menu Contextual donde se ocultara si la celda es de lectura, 
      //O se mostrara si la celda es de edicion. 
      dgw.ContextMenuStrip.Opening += (s, i) => 
       { 
        if (dgw.CurrentCell.ReadOnly) 
         i.Cancel = true;//Evita que se muestre el Menu Contextual 
        else 
        { 
         i.Cancel = false;//Permite que se muestre el Menu Contextual 
         ContextMenu.Show(dgw, new Point(e.X, e.Y));        
        }        
       };      
     } 
    } 
관련 문제