2009-10-13 33 views
9

Ho associato una tabella di dati a DataGridView, questa tabella di dati ha una colonna denominata "Stato" che è di tipo Boolean. Posso impostare il valore su true o false semplicemente tramite codice.Come verificare se un DataGridViewCheckBoxCell è verificato

Tuttavia, non riesco a capire come controllare se la riga data è già selezionata o meno. Questo è il codice che sto cercando di usare e la sua compilazione mostra l'errore "il cast specificato non è valido".

Qualsiasi aiuto sarebbe apprezzato.

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

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

Hai due calchi nel codice di esempio. Quale sta causando l'errore? Lanciare la cella a un DataGridViewCheckBoxCell o trasmettere il valore a un bool? –

+0

Forse non del tutto correlato a questa domanda, ma questo può aiutare: https://stackoverflow.com/a/48465766/5750078 – Loaderon

risposta

0

CbxCell.Value deve essere uguale per DBNull.Value (la colonna può contenere valori nulli giusto?)

vorrei controllare per DBNull prima di casting:

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

Il il problema è che il valore FALSE predefinito per un DataGridCheckBoxColumn è nullo e il valore predefinito TRUE è il valore booleano True. Ciò causa un problema perché i valori booleani non sono annullabili. È possibile risolvere questo problema in due modi:

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

L'altro modo per risolvere questo viene impostata la proprietà TrueValue della colonna a un valore. Questo può essere fatto in fase di progettazione, come indicato:

enter image description here

Poi si può scrivere:

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

Questo funziona perché le stringhe sono annullabili.

Nota: anche se imposto che FalseValue sia F, il valore falso sembra ancora null, quindi suggerisco di ignorare la proprietà FalseValue.

Un'altra nota: se si mette qualcosa in TrueValue come sopra e poi attemp per cancellarlo, vero valore diventa null (ahi), richiede l di eliminare la colonna e poi ri-inserirlo al fine di ripristinare al condizione di default Oppure si può cambiare in codice come segue:

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

Ho provato il primo. Lavori. Grazie! –

+0

è un po 'strano, ma 'true.Equals (cbxCell.Value)' è ok con 'null',' DBNull.Value', e il valore booleano 'true' di default. – Slai

1

Un altro problema che si possono incontrare è questa:

Quando l'utente fa clic sulla cella per selezionare o deselezionare la casella, il valore sottostante non sarà cambiato fino a quando la cella perde la messa a fuoco.

Questo non sarà un problema se il codice in questione si trova in un pulsante, poiché la cella perderà lo stato attivo quando si fa clic sul pulsante. Ma se il tuo codice viene attivato da un timer, puoi ancora controllare il valore "vecchio".

vedere la mia altra risposta qui: https://stackoverflow.com/a/22080846/1015072

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

Grazie a tutti voi. Ho avuto lo stesso problema ma ho scoperto che scrivere senderGrid.EndEdit(), prima di controllare il valore, lo risolve.

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 
      } 
     } 
    } 

Mantenere il buon lavoro

+0

Se posso invitare infinite volte lo farei per questa risposta, ho avuto problemi con questo problema ma la tua risposta l'ha fatto. Rispetto super-massiccio! – 3bdalla