2012-03-14 26 views
6

Tengo un DataGridView vinculado a una lista de objetos POCO. Una de las propiedades de POCO es un bool, que está representado por una casilla de verificación. Lo que me gustaría es poder seleccionar varias filas, luego cuando hago clic en una de las casillas de verificación, todas las filas resaltadas tienen sus casillas de verificación marcadas. A modo de ejemplo, si está utilizando TFS en VS 2010, estoy tratando de replicar el comportamiento en la pantalla Cambios pendientes.DataGridView: Aplicar una edición a todas las filas seleccionadas

Mi problema es que no puedo encontrar un evento adecuado para escuchar. La mayoría de los eventos de clic de DataGridView parecen operar en el nivel Columna/Fila, y quiero que se active algo al hacer clic en la casilla de verificación. CellContentClick es el más cercano, pero se dispara después de las filas se han desmarcado, por lo que no va a funcionar.

¿Alguien tiene alguna sugerencia?

+0

¿Quiere decir que tiene una casilla de verificación Seleccionar todo? – PraveenVenu

+0

No del todo. Supongamos que tiene seis filas y resalta/selecciona 4 filas. A continuación, hace clic en una casilla de verificación en una de esas filas resaltadas, cambiando su estado a Comprobado. Las cuatro filas seleccionadas ahora deben verificarse, independientemente de su estado anterior. – TarkaDaal

+0

Mantenlo simple es la política. ¿Por qué no modifica el valor de la propiedad para el ítem de datos de la fila verdadero mientras el usuario selecciona la fila en la grilla? que actualizará la GUI como un control vinculado. –

Respuesta

10

Puede usar CurrentCellDirtyStateChanged para cuando el valor de la casilla de verificación haya cambiado. Pero cuando se desencadena este evento, los selectedrows se habrán ido. Todo lo que debe hacer es guardar sus selecciones antes.

Una muestra simple: puede completarla fácilmente.

DataGridViewSelectedRowCollection selected; 

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) 
{ 
    DataGridView dgv = (DataGridView)sender; 
    DataGridViewCell cell = dgv.CurrentCell; 
    if (cell.RowIndex >= 0 && cell.ColumnIndex == 1) // My checkbox column 
    { 
     // If checkbox value changed, copy it's value to all selectedrows 
     bool checkvalue = false; 
     if (dgv.Rows[cell.RowIndex].Cells[cell.ColumnIndex].EditedFormattedValue != null && dgv.Rows[cell.RowIndex].Cells[cell.ColumnIndex].EditedFormattedValue.Equals(true)) 
      checkvalue = true; 

     for (int i=0; i<selected.Count; i++) 
      dgv.Rows[selected[i].Index].Cells[cell.ColumnIndex].Value = checkvalue; 
    } 

    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); 
} 

private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    selected = dataGridView1.SelectedRows; 
} 
1

Esto no es un diseño agradable, pero se puede tratar de utilizar el evento MouseDown (lo que dará lugar antes de la rejilla cambiar la selección) y HitTest (a saber dónde es hacer clic el usuario):

private void dataGridView1_MouseDown(object sender, MouseEventArgs e) 
{ 
    var hitTest = this.dataGridView1.HitTest(e.X, e.Y); 
    if (hitTest.Type == DataGridViewHitTestType.Cell && hitTest.ColumnIndex == 0 /* set correct column index */) 
    { 
     foreach (DataGridViewRow row in this.dataGridView1.Rows) 
     { 
      // Toggle 
      row.Cells[0].Value = !((bool)row.Cells[0].Value); 
     } 
    } 
} 
Cuestiones relacionadas