2008-10-06 26 views

Respuesta

15
// Clear all the previously selected rows 
    foreach (DataGridViewRow row in yourDataGridView.Rows) 
    { 
     row.Selected = false; 
    } 

    // Get the selected Row 
    DataGridView.HitTestInfo info = yourDataGridView.HitTest(e.X, e.Y); 

    // Set as selected 
    yourDataGridView.Rows[info.RowIndex].Selected = true; 
+3

esto se pone muy lento cuando la cantidad de filas es alta ... – karlipoppins

+2

Si su DataGridView tiene MultiSelect se establece en false y despejándose la selección previa es innecesario Además, HitTestInfo puede devolver HitTestInfo.Nowhere si el hit no es una Fila/Columna válida. – stuartd

+0

¿No puede .ClearSelection ayudar a acelerar las cosas? – ccalboni

5

Lo interesante es añadir un menú en ese botón derecho del ratón, por ejemplo, con la opción como "información Ver cliente", "verificar últimas facturas", "Añadir una entrada de registro para este cliente", etc.

solo necesita agregar un objeto ContextMenuStrip, agregar las entradas de menú y, en las propiedades de DataGridView, simplemente seleccione ContextMenuStrip.

Esto crearía un nuevo menú en la fila que el usuario hace clic derecho con todas las opciones, entonces todo lo que necesita hacer es hacer su magia :)

recuerde que necesita código JvR para conseguir lo fue la fila usuario, luego tome la celda que contiene la ID del cliente, por ejemplo, y pase esa información.

espero que ayude a mejorar su aplicación

http://img135.imageshack.us/img135/5246/picture1ku5.png

http://img72.imageshack.us/img72/6038/picture2lb8.png

0

Puede utilizar el código de JvR en el evento MouseDown de su DataGridView.

3

Subclase el DataGridView y crear un evento MouseDown para la red,


private void SubClassedGridView_MouseDown(object sender, MouseEventArgs e) 
{ 
    // Sets is so the right-mousedown will select a cell 
    DataGridView.HitTestInfo hti = this.HitTest(e.X, e.Y); 
    // Clear all the previously selected rows 
    this.ClearSelection(); 

    // Set as selected 
    this.Rows[hti.RowIndex].Selected = true; 
} 
17

hacer que se comporte de manera similar al botón izquierdo del ratón? p.ej.

private void dataGridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     dataGridView.CurrentCell = dataGridView[e.ColumnIndex, e.RowIndex]; 
    } 
} 
+0

Esto funcionó bien para mí, ¡gracias! – Superbeard

+3

Esto es más flexible y completo que la respuesta de JvR, pero debe agregar un cheque para 'e.ColumnIndex> = 0 && e.RowIndex> = 0' en caso de que el usuario haga clic derecho en un encabezado. – Chad

0

que tiene que hacer dos cosas:

  1. Borrar todas las filas y seleccionar la corriente. Me bucle a través de todas las filas y utilizar la expresión Bool i = e.RowIndex para este

  2. Si usted ha hecho Paso 1 todavía tiene un gran escollo:
    DataGridView1.CurrentRow no vuelve a su fila seleccionada previamente (lo cual es bastante peligroso). Desde CurrentRow es de sólo lectura que tiene que hacer

    Me.CurrentCell = Me.Item(e.ColumnIndex, e.RowIndex)

    Protected Overrides Sub OnCellMouseDown(
        ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) 
    
        MyBase.OnCellMouseDown(e) 
    
        Select Case e.Button 
         Case Windows.Forms.MouseButtons.Right 
          If Me.Rows(e.RowIndex).Selected = False Then 
           For i As Integer = 0 To Me.RowCount - 1 
            SetSelectedRowCore(i, i = e.RowIndex) 
           Next 
          End If 
    
          Me.CurrentCell = Me.Item(e.ColumnIndex, e.RowIndex) 
        End Select 
    
    End Sub 
    
Cuestiones relacionadas