2009-06-22 50 views
9

Tengo problemas para manejar las selecciones en DataGridView. Mi vista de cuadrícula contiene una columna de cantidad. Hay un cuadro de texto en el formulario que debe mostrar la cantidad total de las filas de la vista de cuadrícula seleccionada. Por lo tanto, necesito capturar eventos cuando el usuario selecciona/deselecciona las filas de la vista de cuadrícula y calcula (agrega/resta) la cantidad en consecuencia. He encontrado dos formas de hacerlo:DataGridView capturar selección de fila de usuario

  1. Uso de los RowEnter y RowLeave eventos. Funcionan bien cuando el usuario selecciona/deselecciona una sola fila. Sin embargo, cuando el usuario selecciona múltiples filas de una sola vez, el evento solo se activa para la última fila. Por lo tanto, de mi importe total solo se suma/resta la cantidad en la última fila. Por lo tanto, hacer que mi resultado sea erróneo.

  2. Usando el evento RowStateChanged. Esto funciona para múltiples filas. Sin embargo, el evento se activa si el usuario se desplaza por la cuadrícula de datos.

Alguien ha manejado tal situación. Me gustaría saber qué evento de cuadrícula de datos debería utilizar, para que mi código se ejecute solo cuando el usuario selecciona/anula la selección de filas, incluidas varias filas.

Respuesta

15

Encontré la solución. Puedo usar mi RowStateChanged y ejecutar código sólo si StateChanged para la fila es Selected ...

private void dgridv_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e) 
{ 
    // For any other operation except, StateChanged, do nothing 
    if (e.StateChanged != DataGridViewElementStates.Selected) return; 

    // Calculate amount code goes here 
} 
0

Puede usar su primer método (fila ingresar la licencia de fila) junto con la propiedad SelectedRows. Es decir, cuando detecta esos eventos y necesita calcular, en lugar de usar la fila de los argumentos de evento, recorra las Filas Seleccionadas y obtenga su total.

+0

no puedo hacer esto, porque tengo que restar la cantidad de esos registros que fueron seleccionados inicialmente y no se seleccionan ahora. –

2

Simplemente puede capturar esto en modo siguiente, pero se limita sólo a la selección sola fila:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) 
{ 
    MessageBox.Show("Selected row is=" + e.RowIndex); 
    // you can perform (any operation) delete action on selected row like 

    dataGridView1.Rows.RemoveAt(e.RowIndex); 
    dataGridView1.Refresh(); 
} 
+1

No es suficiente cuando el usuario ingresa en una fila con el teclado – Alireza

2

creo que se puede considerar el caso SelectionChanged:

private void DataGridView1_SelectionChanged(object sender, EventArgs e) { 
    textbox1.Text = DataGridView1.SelectedRows.Count.ToString(); 
} 
2

utilizo SelectionChanged incluso T o CellValueChanged evento:

 dtGrid.SelectionChanged += DataGridView_SelectionChanged; 
     this.dtGrid.DataSource = GetListOfEntities; 
     dtGrid.CellValueChanged += DataGridView_CellValueChanged; 


    private void DataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
    { 
     DataGridViewRow row = dtGrid.Rows[e.RowIndex]; 
     SetRowProperties(row); 
    } 

    private void DataGridView_SelectionChanged(object sender, EventArgs e) 
    { 
     var rowsCount = dtGrid.SelectedRows.Count; 
     if (rowsCount == 0 || rowsCount > 1) return; 

     var row = dtGrid.SelectedRows[0]; 
     if (row == null) return; 
     ResolveActionsForRow(row); 
    } 
+0

¿Qué es SetRowProperties? – John

Cuestiones relacionadas