2017-06-20 5 views
1

私はC#でメソッドの計算をしたいが、私はコードを実行すると、値を変換する際にエラーが出る。メッセージのエラーは「オブジェクトはDBNullから他の型にキャストできません」です。エラーはint int bal = 0;で始まります。計算中の変換

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

質問にエラーの完全な説明を追加します。また、コードをデバッグして自分自身が何が間違っているのかを理解しようとすると、悪くはありません。おそらくあなたのエラーは 'dataGridView3.Rows [i] .Cells [3] .Value'は整数ではない値を含むことができます。 –

+0

私はすでに説明を編集しています。列の値は整数です。 @ S.Petrosov –

+0

* grid *で計算を実行しないでください。実際のデータでは、データグリッドでもオブジェクトのリストでも構いません。この場合、文字列を解析する必要はありません。 –

答えて

-1

つまり、グリッドにはヌル値があります。 もあなたのグリッドを充填しながらあなたのヌル制御を行うことができ、この

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();  
} 

のように試してみてください。 ADO.NETを使用する場合は、COALESCEメソッドを使用できます。

SELECT column FROM TableName 

クエリはnull値を返すことができる場合exempleについては

いますが、

SELECT COALESCE (column, 0) FROM TableName 

この時間を入力する場合、値がnullの場合、それは代わりに0を返します。

+0

あなたの新しく追加されたif文は、3つの開始小文字と1つの終了を持っています...あなたの提案を書き換えることを提案します。 –

0

おそらく、dataGridView3.Rows[i].Cells[3].Valueの値はDBNull.Valueです。 DBNull.ValueInt32に変換できません。これは、式Convert.ToInt32(dataGridView3.Rows[i].Cells[3].Value)が失敗することを意味します。

Valueの内容がDBNull.Valueであるかどうかを最初にテストします。そうなら、それをスキップしてください。

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

これは私が複製用に提供した回答と同じです。 –

+0

@ S.Petrosov:あなたがダウン投票していると仮定します:これが正解でなければならない同じ答えであれば!なぜdownvote?私はstackoverflowからのルールに従った。あなたはどこに答えましたか?コメントで?それは素晴らしいことですが、コメントは回答のためのものではありません。さらに:私は最初にあなたのコメントを読んでいませんでした。 –

+0

これは重複した質問であり、同じ回答を提供する代わりに重複としてマークする必要があります –