2017-06-20 6 views
1

Ich möchte Methodenberechnung in C#, aber wenn ich den Code ausführen, geben Sie mir Fehler bei der Konvertierung Wert. Der Nachrichtenfehler lautet "Objekt kann nicht von DBNull in andere Typen umgewandelt werden". Der Fehler beginnt bei Zeile int bal = 0;Konvertieren in Berechnung

private void btn_total_Click(object sender, EventArgs e) 
    { 

     //int[] columnData = (from DataGridViewRow row in dataGridView3.Rows where row.Cells[2].FormattedValue.ToString() != string.Empty select Convert.ToInt32(row.Cells[2].FormattedValue)).ToArray(); 
     //lbl_sum.Text = columnData.Sum().ToString(); 

     int sum = 0; 
     for (int i = 0; i < dataGridView3.Rows.Count; ++i) 
     { 
      sum += Convert.ToInt32(dataGridView3.Rows[i].Cells[2].Value); 
     } 

     int bal = 0; 
     for (int i = 0; i < dataGridView3.Rows.Count; ++i) 
     { 
      bal = Convert.ToInt32(dataGridView3.Rows[i].Cells[3].Value) - sum; 
     } 


     if (bal <0) 
     { 
      label_bal_pay.Text = bal.ToString(); 
     } 
     else 
     { 
      lbl_bal.Text = bal.ToString(); 
     } 


     label_bal_pay.Text = bal.ToString(); 
     lbl_bal.Text = bal.ToString(); 
     lbl_sum.Text = sum.ToString(); 
    } 
+1

Fügen Sie die vollständige Beschreibung des Fehlers der Frage hinzu. Es wird auch nicht schlecht sein, wenn Sie versuchen, Ihren Code zu debuggen und zu verstehen, was Sie falsch machen. Wahrscheinlich wird Ihr Fehler als 'dataGridView3.Rows [i] .Cells [3] .Value' kann einen Wert enthalten, der keine Ganzzahl ist. –

+0

Ich bearbeite bereits die Beschreibung. Der Wert in der Spalte ist Ganzzahl. @ S.Petrosov –

+0

Führen Sie keine Berechnungen für das * Raster * durch, tun Sie dies auf den tatsächlichen Daten, ob das ein DataGrid oder eine Liste von Objekten ist. Sie müssen in diesem Fall keine Strings analysieren –

Antwort

-1

Es bedeutet in Ihrem Raster gibt es Nullwerte. Versuchen Sie, wie dieses

private void btn_total_Click(object sender, EventArgs e) 
{ 
    //int[] columnData = (from DataGridViewRow row in dataGridView3.Rows where row.Cells[2].FormattedValue.ToString() != string.Empty select Convert.ToInt32(row.Cells[2].FormattedValue)).ToArray(); 
     //lbl_sum.Text = columnData.Sum().ToString(); 

     int sum = 0; 
     for (int i = 0; i < dataGridView3.Rows.Count; ++i) 
     { 
      if (dataGridView3.Rows[i].Cells[2].Value != null && dataGridView3.Rows[i].Cells[2].Value != DbNull.Value) 
       sum += Convert.ToInt32(dataGridView3.Rows[i].Cells[2].Value); 
     } 

     int bal = 0; 
     for (int i = 0; i < dataGridView3.Rows.Count; ++i) 
     { 
      if (dataGridView3.Rows[i].Cells[3].Value != null && dataGridView3.Rows[i].Cells[3].Value != DbNull.Value) 
       bal = Convert.ToInt32(dataGridView3.Rows[i].Cells[3].Value) - sum; 
     } 

     if (bal < 0) 
     { 
      label_bal_pay.Text = bal.ToString(); 
     } 
     else 
     { 
      lbl_bal.Text = bal.ToString(); 
     } 


     label_bal_pay.Text = bal.ToString(); 
     lbl_bal.Text = bal.ToString(); 
     lbl_sum.Text = sum.ToString();  
} 

Sie Ihre null Kontrolle tun können, während das Raster zu füllen. Wenn Sie ADO.NET verwenden, können Sie die COALESCE-Methode verwenden.

Für exemple wenn

SELECT column FROM TableName 

Abfrage NULL-Werte zurückgeben kann, aber wenn Sie

SELECT COALESCE (column, 0) FROM TableName 

dieses Mal eingeben, wenn der Wert null ist, wird es 0 statt zurück.

+0

Ihre neu hinzugefügten if-Anweisungen haben drei öffnende Klammern und eine Schließung ... Ich schlage vor, Ihren Vorschlag neu zu schreiben. –

0

Möglicherweise sind die Werte innerhalb dataGridView3.Rows[i].Cells[3].ValueDBNull.Value. A DBNull.Value kann nicht in Int32 konvertiert werden. Dies bedeutet, dass der Ausdruck Convert.ToInt32(dataGridView3.Rows[i].Cells[3].Value) fehlschlägt.

Zuerst testen, ob der Inhalt des ValueDBNull.Value ist. Wenn ja, überspringen Sie es.

if (dataGridView3.Rows[i].Cells[3].Value != DBNull.Value) 
    bal = Convert.ToInt32(dataGridView3.Rows[i].Cells[3].Value) - sum; 
+0

Dies ist das gleiche wie die Antwort, die ich für das Duplizieren angegeben habe. –

+0

@ S.Petrosov: Angenommen, Sie sind der eine Downvoting: Wenn dies die gleiche Antwort ist, dann muss es eine richtige Antwort sein! Warum der Downvote? Ich habe die Regeln vom Stackoverflow eingehalten. Wo hast du geantwortet? In den Kommentaren? Das ist auch toll, aber die Kommentare sind nicht für Antworten gedacht. Außerdem: Ich habe deinen Kommentar nicht gelesen. –

+0

Weil dies doppelte Frage ist und muss als Duplikat markiert werden, anstatt die gleiche Antwort –