2017-08-15 6 views
2

ich den folgenden Code haben:Wie zu beheben Datagridview Fehler?

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) 
{ 
    string age = dataGridView1.Rows[e.RowIndex].Cells["dataGridViewTextBoxColumn43"].Value.ToString(); 

    dataGridView1.Rows[e.RowIndex].Cells["dataGridViewTextBoxColumn43"].Value = (age == "1") ? "Муж" : "Жен"; 
} 

Als ich Programm ausführen es fatal Nachricht gibt:

enter image description here

In Datenbankfeld gender ist als integer Typ. Dieser Wert sollte zum Spaltennamen hinzugefügt werden: dataGridViewTextBoxColumn43.

Abfrage zur Datenbank:

public Datatable select (SQLiteDatabase db) {

return db.GetDataTable("SELECT " + 
     "Pacients.id, " + 
     "unique_code," + 
     "status_pass, " + 
     "payment, " + 
     "profession," + 
     "office_address, " + 
     "factory_name, " + 
     "factory_edrpou, " + 
     "factory_departament," + 
     "name, " + 
     "secondname, " + 
     "lastname, " + 
     "datebirth, " + 
     "taxcode, " + 
     "gender, " + 
     "Pacients.created_at, " + 
     "file, " + 
     "PacientsOrder.kind_work, " + 
     "PacientsOrder.status " + 
     "FROM Pacients LEFT JOIN PacientsOrder ON PacientsOrder.pacient_id = Pacients.id LEFT JOIN Transactions ON Transactions.pacient_id = Pacients.id ORDER BY Pacients.id DESC"); 
} 
+0

Haben Sie den Code debuggen? Welche Codezeile gibt Ihnen einen Fehler? Der Code spricht über das Alter, während Ihre Beschreibung sagt über Geschlecht aber Ausnahme ist FormatException der Umwandlung von Nummer in String, während Code keine Konvertierungsmethode verwendet hat. Was vermisse ich hier. –

+0

Es sieht so aus, als ob Sie versuchen, einer Zelle, die an eine numerische Spalte einer Datenquelle gebunden ist, einen Textwert zuzuweisen. Dann schlägt die Konvertierung fehl. Haben Sie einen bestimmten Datentyp für die Spalte 'dataGridViewTextBoxColumn43' festgelegt? –

+0

https://stackoverflow.com/questions/13157891/bit-datatype-to-enum-type-mapping-from-database-to-dataset-in-sql-server-2008 – Slai

Antwort

0

Das Problem war die folowing, es obvios ist, aber nicht sofort klar:

Das gender Feld in der Datenbank als integer Typ gespeichert wird.

Also, wenn ich binden DataGridView mit vorhandenen Datenbanktabelle Es reserviert Speicher für das Erstellen von Tabelle mit Definition alle Eigenschaften der Tabelle, einschließlich Zelltypen.

Daher, wenn es beim ersten Mal passiert, erwartet die Datagridview Ganzzahl-Datentyp als Wert, aber ich ändere die Wert Zelle in String-Wert und versuchen, Wert zu überschreiben.

Es handelt sich um einen schwerwiegenden Fehler.

Lösung war, alle Datentypen zu ändern, die integer zu string Typ haben.

Danke für die Antworten, es wird angenommen!

1

Wenn die Spalte ValueTy‌​pe numerisch ist, können Sie das Zahlenformat im Designer Муж;;Жен ändern

dataGridView1.Columns["dataGridViewTextBoxColumn43"].DefaultCellStyle.Format = "Муж;;Жен"; 
+0

Auf welche Art hängt der Typ? – OPV

+0

@OPV Ich bin mir nicht sicher, was du meinst. Null (0) Zahlen sind zu "' Жен'' formatiert, und positive Zahlen zu ,, 'Муж'' '. Jeder numerisch signierte, unsigned oder Gleitkommatyp wie 'int',' Int64', 'dezimal' funktioniert – Slai

0

Wenn ich Sie richtig verstehe, versuchen Sie, einen Textwert basierend auf einer Ganzzahl zu einer Spalte hinzuzufügen Wert, der sich zur Zeit in der gleichen Spalte befindet (dh Sie wechseln Spaltenwerttypen)?

Bitte tun Sie es nicht so, da es aus verschiedenen Gründen nicht funktioniert. Abgesehen von Ihrem Fehler ist der wichtigste Grund, dass dieses Ereignis ausgelöst wird, wenn Sie die DataSource Ihres DataGridView für jede erstellte Zeile festlegen, aber der e.RowIndex nicht immer der Zeilenindex der neuen Zeile ist. Für vollständige Details lesen Sie here.

Normalerweise würden Sie RowsAdded nur verwenden, wenn der Benutzer eine neue Zeile aus der Schnittstelle eingefügt hat.

Sie sollten stattdessen diese Konvertierung in Ihrer SELECT-Anweisung bereitstellen, die die Daten aus der Datenbank liest. Auf diese Weise müssen Sie die Daten nicht konvertieren, wenn sie DataGridView treffen. So braucht Ihre SELECT zu sein, etwas wie:

SELECT .... CASE WHEN gender = 1 THEN 'МУЖ' ELSE 'ЖЕН' END AS gender ... 

bearbeiten

Versuchen Sie Ihre SELECT-Anweisung zu ändern, so liest es sich wie folgt:

public DataTable select(SQLiteDatabase db) { 
    return db.GetDataTable("SELECT " + 
     "Pacients.id, " + 
     "unique_code," + 
     "status_pass, " + 
     "payment, " + 
     "profession," + 
     "office_address, " + 
     "factory_name, " + 
     "factory_edrpou, " + 
     "factory_departament," + 
     "name, " + 
     "secondname, " + 
     "lastname, " + 
     "datebirth, " + 
     "taxcode, " + 
     "CASE WHEN gender = 1 THEN 'МУЖ' ELSE 'ЖЕН' END AS gender, " + 
     "Pacients.created_at, " + 
     "file, " + 
     "PacientsOrder.kind_work, " + 
     "PacientsOrder.status " + 
     "FROM Pacients LEFT JOIN PacientsOrder ON PacientsOrder.pacient_id = Pacients.id LEFT JOIN Transactions ON Transactions.pacient_id = Pacients.id ORDER BY Pacients.id DESC"); 
} 

Jetzt können Sie den Fall loswerden Zeilen hinzufügen komplett , wie die Datenbank die Arbeit für Sie getan hat, bevor es die Datagridview trifft.

+0

Ich verstehe das Problem nicht im root – OPV

+0

Bitte zeigen Sie Ihren Code, der Daten aus der Datenbank bezieht. –

+0

Ich aktualisierte Frage – OPV