如何解决System.InvalidCastException'在DataGridView C#中计算时

时间:2014-11-26 08:35:54

标签: c# sql-server datagridview

我试图在C#的DataGridView中横向排列水平并垂直向下添加,但每次尝试输入数据时都会收到此错误消息:

  

“类型'System.InvalidCastException'的未处理异常   发生在mscorlib.dll中。附加信息:对象不能   从DBNull转换为其他类型“。

这些是我的代码:

 private void tbl_valuesDataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        //totalling horizontally across rows
        int val1 = Convert.ToInt32(tbl_valuesDataGridView.Rows[e.RowIndex].Cells[1].Value);
        int val2 = Convert.ToInt32(tbl_valuesDataGridView.Rows[e.RowIndex].Cells[2].Value);

        tbl_valuesDataGridView.Rows[e.RowIndex].Cells[3].Value = val1 + val2;

         //adding vertically down the total column to get Grand Total 
        double sum = 0;
        for (int i = 0; i < tbl_valuesDataGridView.Rows.Count; ++i)
        {
            sum += Convert.ToDouble(tbl_valuesDataGridView.Rows[i].Cells[2].Value); 
        }
        textBox1.Text = sum.ToString();
    }

注意事项:

  1. DataGridView具有以下列; id哪个自动 增量,value1,value2和total。另外,有一个 我的表单中显示总计的文本框(即总计全部 总列中的值。)。
  2. 在sql server数据库表中,id是类型为int的主键列,值为1,2&amp;总数为'money'类型,并允许为null。
  3. 如果我将代码中的行索引更改为0,1&amp; 2,我没有收到任何错误,但系统将ID(索引0)添加到Value1(索引1)。但是,当我把它改为1,2&amp; 3,那是我收到错误的时候。
  4. 我是编程新手,所以我不知道错误是由于我设置数据库表的方式,还是与我的C#代码有关。

    有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:0)

对于水平加法代码,设置Cells [3] .Value等于Cells [1] .Value + Cells [2] .Value。 这没关系,但你似乎只是为了一行。

然后在你的垂直添加中,你总计了所有行的单元格[2] .Value。

如果我正确理解了代码,你应该总计Cell [3] .Value here(因为这是存储每行的总数)。

在任何情况下,您都需要转到抛出异常的行,并检查调试器Watch窗口中的每个变量。这应该告诉你哪个对象处于不正确的状态。

答案 1 :(得分:0)

有了Anik的帮助和一些调试,我能够得到我的问题的答案。对于我们这些刚接触编程的人,如果您打算使用DataGridView,您会发现此代码非常有用。始终确保为此代码使用CellEndEdit事件处理程序。

 private void tbl_valuesDataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        //totalling horizontally across rows
        int val1 = 0, val2 = 0, demo1;

        if (int.TryParse(tbl_valuesDataGridView.Rows[e.RowIndex].Cells[1].Value.ToString().Trim(), out demo1))
            val1 = Convert.ToInt32(tbl_valuesDataGridView.Rows[e.RowIndex].Cells[1].Value);

        if (int.TryParse(tbl_valuesDataGridView.Rows[e.RowIndex].Cells[2].Value.ToString().Trim(), out demo1))
            val2 = Convert.ToInt32(tbl_valuesDataGridView.Rows[e.RowIndex].Cells[2].Value);

        tbl_valuesDataGridView.Rows[e.RowIndex].Cells[3].Value = val1 + val2;


        //Adding vertically down the total column
        double sum = 0;
        for (int i = 0; i < tbl_valuesDataGridView.Rows.Count; ++i)
        {
            sum += Convert.ToDouble(tbl_valuesDataGridView.Rows[i].Cells[3].Value); //where 1 represents the index of the column you are adding
        }
        textBox1.Text = sum.ToString();
    }