2009-10-13 14 views
9

He vinculado una tabla de datos a un DataGridView, esta tabla de datos tiene una columna llamada "Estado" que es del tipo Boolean. Puedo establecer el valor en true o false bien por código.Cómo verificar si un DataGridViewCheckBoxCell está marcado

Sin embargo, no puedo averiguar cómo verificar si la fila dada ya está marcada o no. Este es el código que estoy tratando de usar y compilarlo muestra el error "el lanzamiento especificado no es válido".

Cualquier ayuda sería apreciada.

if (rowIndex >= 0) 
{ 
    var cbxCell = (DataGridViewCheckBoxCell)dgvScan.Rows[rowIndex].Cells["Status"]; 

    if ((bool)cbxCell.Value) 
    { 
     // Do stuff 
    } 
    else 
    { 
     // Do other stuff 
    } 
} 
+0

Tiene dos moldes en el código de ejemplo. ¿Cuál está causando el error? ¿Lanzando la celda a un DataGridViewCheckBoxCell o lanzando el valor a un bool? –

+0

Quizás no del todo relacionado con esta pregunta, pero esto puede ayudar: https://stackoverflow.com/a/48465766/5750078 – Loaderon

Respuesta

0

CbxCell.Value debe ser igual a DBNull.Value (su columna puede contener valores nulos ¿verdad?)

Me gustaría comprobar por DBNull antes de la fundición:

if (!DBNull.Value.Equals(CbxCell.Value) && (bool)CbxCell.Value == true) 
{ 
    //Do stuff 
} 
else 
{ 
    //Do Stuff 
} 
1
if (Convert.ToBoolean(dgvScan.Rows[rowIndex].Cells["Status"].Value)) 
{ 
//Do Something 
} 
else { 
// Do Something 
} 
8

El El problema es que el valor FALSE predeterminado para un DataGridCheckBoxColumn es nulo, y el valor TRUE predeterminado es el valor booleano True. Esto causa un problema porque los valores booleanos no son anulables. Puede resolver este problema de dos maneras:

if (cbxCell.Value != null && (bool)cbxCell.Value) 
    { 
     do stuff; 
    } 

La otra manera de resolver esto se establece la propiedad TrueValue de la columna a un cierto valor. Esto se puede hacer en tiempo de diseño como se muestra:

enter image description here

entonces usted puede escribir:

if ((string)cbxCell.Value == "T") 
    { 
     do stuff; 
    } 

Esto funciona porque las cadenas son anulables.

Tenga en cuenta: aunque configuré el FalseValue como F, el valor falso todavía parece ser nulo, por lo que sugiero ignorar la propiedad FalseValue.

Otra nota: si coloca algo en TrueValue como el anterior y luego intenta borrarlo, True value se vuelve nulo (ouch), lo que le exige eliminar la columna y luego volver a agregarla para restaurarla al condición predeterminada. O se puede cambiar en el código de la siguiente manera:

((DataGridViewCheckBoxColumn)DataGridView1.Columns["Selected"]).TrueValue = true 
+0

Intenté con el primero. Trabajos. ¡Gracias! –

+0

es un poco extraño, pero 'true.Equals (cbxCell.Value)' está bien con 'null',' DBNull.Value', y el valor 'true' booleano predeterminado. – Slai

1

Otro problema que se puede encontrar es la siguiente:

Cuando el usuario hace clic en la celda para marcar o desmarcar la casilla, no se cambiará el valor subyacente hasta que la célula pierda el foco.

Esto no será un problema si el código en cuestión está en un botón, ya que la celda perderá foco cuando haga clic en el botón. Pero si su código se activa desde un temporizador, es posible que todavía esté comprobando el valor 'anterior'.

ver mi otra respuesta aquí: https://stackoverflow.com/a/22080846/1015072

0
bool checked = cell.Value as bool? ?? false; 
2

Gracias a todos. Tuve el mismo problema pero descubro que escribir senderGrid.EndEdit(), antes de comprobar el valor, lo resuelve.

private void dgvRiscos_CellContentClick(object sender, DataGridViewCellEventArgs e) 
    { 
     var senderGrid = (DataGridView)sender; 
     senderGrid.EndEdit(); 

     if (senderGrid.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn && 
      e.RowIndex >= 0) 
     { 

      var cbxCell = (DataGridViewCheckBoxCell)senderGrid.Rows[e.RowIndex].Cells["associado"]; 
      if ((bool)cbxCell.Value) 
      { 
        // Criar registo na base de dados 
      } 
      else 
      { 
        // Remover registo da base de dados 
      } 
     } 
    } 

Mantener el buen trabajo

+0

Si puedo votarte infinitas veces lo haría por esta respuesta, he estado luchando con este problema pero tu respuesta lo hizo. Respeto supermasivo! – 3bdalla

Cuestiones relacionadas