2014-11-05 34 views
6

Non ho nemmeno un'idea su dove cercare di correggere questo errore. Recentemente vengo seguente eccezione dopo che ho cliccato sulla casella di controllo in una DataGridViewCheckBoxColumn per controllare e lasciare quella cella:DataGridViewCheckBoxColumn: FormatException su boolean-column

System.FormatException: "" non è valido per booleano

Ecco la completa finestra di errore dal DataGridView:

enter image description here

ho anche non so quale evento ho potuto gestire per trovare il motivo per questa edizione. Gli eventi Validating e CellFormatting vengono attivati ​​prima dell'errore, ma entrambi vengono eseguiti. Se gestisco il file DataError, non riesco ancora a capirlo. L'argomento DataGridViewDataErrorEventArgs contiene informazioni seguenti (tra gli altri):

e.ColumnIndex = 0 
e.RowIndex = 0 
e.Context  = Commit 

L'eccezione completo (e.Exception.ToString()) è:

System.FormatException: non è un valore valido per booleano. ---> System.FormatException: String non è stato riconosciuto come booleano valido. al System.Boolean.Parse (valore String) a System.ComponentModel.BooleanConverter.ConvertFrom (ITypeDescriptorContext contesto, CultureInfo, Object value) --- Fine stack eccezione interna --- in System.ComponentModel. BooleanConverter.ConvertFrom (ITypeDescriptorContext contesto, CultureInfo, Object value) a System.ComponentModel.TypeConverter.ConvertFrom (Object value) a System.Windows.Forms.DataGridView.DataGridViewDataConnection.PushValue (Int32 boundColumnIndex, Int32 columnIndex, Int32 rowIndex , Valore dell'oggetto)

Ecco uno screenshot delle proprietà delle colonne pertinenti, la colonna ha ThreeState=false e niente specificato per FalseValue, TrueValue o IndeterminateValue:

enter image description here

L'origine dati del BindingSource è un List<ErpService.ArrivalChargeAssignment> dove ArrivalChargeAssignment è una classe dalla mia WCF webservice con un campo boolIsAssigned, quindi non può mai essere null (o anche una stringa vuota).

+0

Ricordo di aver ricevuto un errore come questo (sebbene non proprio lo stesso messaggio) quando il nostro team stava lavorando a un progetto legacy. Si è scoperto che c'era una sorta di condizione di competizione in corso - la fonte dei dati veniva cambiata/letta in più thread diversi e il controllo non gli piaceva. Ci abbiamo dedicato molto tempo, ma non siamo riusciti a capire cosa lo causasse (anche le serrature non sono state d'aiuto). Alla fine abbandonammo WinForms e passammo a WPF.Probabilmente non è la risposta che stavi cercando, ma se è un progetto nuovo di zecca ne varrà la pena scriverlo in WPF. – PoweredByOrange

+3

Stavo ricevendo lo stesso errore ogni volta che DGV tenta di formattare il valore nel formato di tipo di dati specificato. non ho potuto risolvere questo problema Quindi, ho gestito l'evento 'DataError' per evitare questa eccezione. – Shell

+0

@Nimesh: Sì, forse ingoio anche questa eccezione anche se non mi piace ignorare le eccezioni tanto più se non ne conosco il motivo. –

risposta

7

Ok, ho fatto alcuni test con la forma finestre progettista e ho trovato qualcosa di strano nel generatore di codice. Quindi, quello che ho fatto nei miei test è

Innanzitutto ho aggiunto una colonna con il tipo DataGridViewCheckBoxColumn e ho popolato il datagridview con una tabella di dati. Ho aggiunto qualche record con valori nulli.

Ora funzionava correttamente e i dati venivano visualizzati correttamente e inoltre non davano alcun errore. Quindi ho modificato la proprietà di quello CheckedBoxColumn e rimosso il valore False dalla proprietà Nullvalue e riavviarlo. Ora, l'applicazione mostra questo errore.

Sono tornato a quella proprietà DefaultCellStyle e ho impostato il valore False. poi ho eseguito di nuovo quel progetto. Ma, ancora mi stava mostrando lo stesso errore.

Quindi, caricato il file Form.designer.cs e controllato l'oggetto dataGridViewCellStyle1. dove ho trovato che la proprietà è impostata con il valore di tipo stringa "False" invece del tipo booleano false.

dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; 
dataGridViewCellStyle1.NullValue = "False"; 
this.Column1.DefaultCellStyle = dataGridViewCellStyle1; 
this.Column1.HeaderText = "Check Box"; 
this.Column1.Name = "chkCol"; 

Quindi, ho aggiornato la riga come segue e riavviato il progetto. Ora, l'errore è sparito.

dataGridViewCellStyle1.NullValue = false; 

Quando ho creato che DataGridViewCheckBoxColumn ho trovato che non v'è alcun oggetto viene creato per la proprietà di stile delle cellule di default. Quindi, per impostazione predefinita, la proprietà NullValue prendeva il valore false. ma, dopo aver modificato la proprietà, l'oggetto è stato creato e la proprietà viene assegnata con valore di tipo stringa.

AGGIORNATO: Questo problema può essere risolto semplicemente ricreando quella colonna.

+1

Grazie mille. Strano che non ho provato a ricreare la colonna che dovrebbe essere la prima azione con i prodotti MS (riavvio);) Grazie ancora. –

+0

Nice Answer, Precisely written – Mohit

+1

welcome @TimSchmelter, sempre felice di aiutare e ho anche imparato qualcosa di nuovo oggi. – Shell

0

uso questo può essere l'uso completa

private void DataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
     { 
      DataGridView1["Your Column Index", e.RowIndex].Value = Convert.ToBoolean(DataGridView1["Your Column Index", e.RowIndex].Value); 
     } 

private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) 
     { 
      if (Convert.ToBoolean(DataGridView1["Your Column Index", e.RowIndex].Value)) 
      { 
       DataGridView1["Your Column Index", e.RowIndex].Value = false; 
      } 
      else 
      { 
       DataGridView1["Your Column Index", e.RowIndex].Value = true ; 
      } 
     } 
0

Si può anche fare una cosa. Durante la creazione della griglia, è possibile assegnare il valore booleano "true" o false (come mostrato di seguito). Nella domanda precedente, l'indice della colonna è 0 e il comando rowindex è accessibile quando si crea la griglia. Non otterrai l'errore. Ho affrontato lo stesso problema e l'ho risolto come mostrato di seguito. Apprezzo anche le altre 2 risposte.

DataGridViewCell oCell; 
oCell = dataGridView["Your Column Index", "Your Row index"]; 
oCell.Value = false; 
0

ho appena risolto in un modo elegante, se il tipo di colonna database è booleana ("po") e il vostro DataGridView AutoGenerateColumns è vero, allora un DataGridViewCheckBoxColumn verrà generato, in modo che tutti è necessario modificare i valori true e false predefiniti e il tipo di dati.

codice generico per risolvere il problema, inserire dopo DataSource assingment:

foreach (DataGridViewColumn dc in DataGridView1.Columns) 
{ 
    if (dc.ValueType == typeof(Boolean)) 
    { 
     dc.ValueType = typeof(Int32); 
     ((DataGridViewCheckBoxColumn)dc).DefaultCellStyle.NullValue = 0; 
     ((DataGridViewCheckBoxColumn)dc).TrueValue = 1; 
     ((DataGridViewCheckBoxColumn)dc).FalseValue = 0; 
    } 
} 
0

ho lottato con lo stesso problema e hanno una semplice correzione senza dover scrivere alcun codice.

Il problema non è con i parametri "TrueValue" o "FalseValue" e non è necessario intercettare il gestore degli errori. Il problema in poche parole è quando l'oggetto DataGridView aggiunge una nuova riga (da qui l'errore si attiva durante il disegno iniziale), ma la radice del problema è che i dati nella nuova riga non sono ancora stati inizializzati, quindi è "indeterminato" ".... quindi basta impostare un valore predefinito per" IndeterminateValue "invece di lasciarlo vuoto.

Problemi correlati