2011-05-04 30 views
9

Tengo un datagridview donde muestro información sobre los productos. Quiero vincular un menú contextual cuando el usuario selecciona una celda y luego hace clic con el botón derecho en esa celda. Tengo otro menú contextual y ese está vinculado a las columnas de la vista de cuadrícula de datos. Si un usuario hace clic derecho en una columna, aparece el menú contextual.C# - DatagridView y ContextMenu

Lo he intentado así pero no funciona. El menú contextual muestra cuando el usuario hace clic derecho en una celda, pero el menú contextual que está vinculado al encabezado de la columna no funciona.

private void GridView1_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      productContextMenu.Show(GridView1, e.Location); 
     } 

    } 

¿Cómo lo hago para que cuando el usuario haga clic con el botón derecho en un datagridview aparezca?

Muchas gracias de antemano.

EDITAR

Thnx por las respuestas. Resolví el problema de esta manera:

private void GridView1_MouseUp(object sender, MouseEventArgs e) 
    { 
     DataGridView.HitTestInfo hitTestInfo; 
     if (e.Button == MouseButtons.Right) 
     { 
      hitTestInfo = GridView1.HitTest(e.X, e.Y); 
      if (hitTestInfo.Type == DataGridViewHitTestType.Cell) 
      { 
       productContextMenu.Show(GridView1, e.Location); 
      } 

     } 
    } 

Se muestran ambos contextmenus. Cuando hago clic en la columna que muestra el menú contextual, y cuando hago clic en una celda, aparece el menú contextual.

+0

Gracias para saber que tienes una respuesta :) – Dotnet

+0

¿Por qué no marca como respuesta? Si tiene la solución con su idea – Vivekh

+0

Ju Sano. Thnx otra vez! – Erika

Respuesta

12

Prueba este

private void dataGridView1_CellMouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     contextMenu.Show(datagridview, e.Location); 
    } 

} 

o

private void dataGridView_MouseUp(object sender, MouseEventArgs e) 
{ 
    // Load context menu on right mouse click 
    DataGridView.HitTestInfo hitTestInfo; 
    if (e.Button == MouseButtons.Right) 
    { 
     hitTestInfo = dataGridView.HitTest(e.X, e.Y); 
     // If column is first column 
     if (hitTestInfo.Type == DataGridViewHitTestType.Cell && hitTestInfo.ColumnIndex == 0) 
     contextMenuForColumn1.Show(dataGridView, new Point(e.X, e.Y)); 
    // If column is second column 
     if (hitTestInfo.Type == DataGridViewHitTestType.Cell && hitTestInfo.ColumnIndex == 1) 
     contextMenuForColumn2.Show(dataGridView, new Point(e.X, e.Y)); 
    } 
} 
+0

No sé por qué, pero no funciona. Cuando hago clic derecho en la columna de la vista de tabla de datos, aparece el menú contextual, pero cuando hago clic con el botón derecho en una celda, el menú contextual no funciona. – Erika

+0

Por alguna razón, siempre obtengo la columna 0 para _hitTest.ColumnIndex_. Aquí está mi código para agregar el oyente: ** dataGridView.ColumnHeaderMouseClick + = dataGridView_ColumnHeaderMouseClick; ** y aquí está mi definición de oyente: ** private void dataGridView_ColumnHeaderMouseClick (object remitente, MouseEventArgs e) ** –

1

Para el problema con la posición relativa, también se puede utilizar este abordaje:

DataGridViewColumn dgvC = new DataGridViewColumn(); 
DataGridViewRow dgvR = new DataGridViewRow(); 
dgvC = dgv.Columns[e.ColumnIndex]; 
dgvR = dgv.Rows[e.RowIndex]; 
Point p = new Point(); 
p.X = (dgvC.Width * e.ColumnIndex) + e.X; 
p.Y = (dgvR.Height * e.RowIndex) + e.Y; 
dgv.ContextMenu.Show(dgv, p);