int解析DataGridView行值时的Null引用异常

时间:2011-09-07 11:39:13

标签: c# datagridview

以下代码的目的是总结datagridview的所有索引3,它将继续在订单系统中无限添加,并将其显示在名为Price的标签中。

private void Add_Click(object sender, EventArgs e)
{
    dgvSelected.Rows.Add(dgvItem.SelectedCells[0].Value.ToString(),
                         dgvItem.SelectedCells[1].Value.ToString(), 
                         dgvItem.SelectedCells[2].Value.ToString(), 
                         dgvItem.SelectedCells[3].Value.ToString());

    for (int i = 0; i < dgvSelected.Rows.Count; i++)
    {
        price = price + int.Parse(dgvSelected.Rows[i].Cells[3].Value.ToString());
        Price.Text = price.ToString();
    }       
}

问题在于它一直在说:

  

“对象引用未设置为对象的实例。”

...作为以下行的错误:

price = price + int.Parse(dgvSelected.Rows[i].Cells[3].Value.ToString());

表中应该没有null,但错误仍然是坚持存在null。表中有多行,但它可以读取的唯一行是第1行。当涉及到具有值的第二行时,它会说出有关的错误。

4 个答案:

答案 0 :(得分:6)

当然编程语言不错。它向您报告您要使用的对象引用实际上是空的。

dgvSelected.Rows[i].Cells[3].Value.ToString()部分中,以下之一为null

  • <击> dgvSelected
  • <击> dgvSelected.Rows
  • <击> dgvSelected.Rows[i]
  • <击> dgvSelected.Rows[i].Cells
  • dgvSelected.Rows[i].Cells[3]
  • dgvSelected.Rows[i].Cells[3].Value

正如您所看到的,您应该进行大量检查以确保这些对象都不为空

编辑:Strikeout其中一些,正如在评论中正确指出的那样,如果那些是null,则不会输入循环。

答案 1 :(得分:1)

就是你,在这一行上,某些东西是空的。

price = price + int.Parse(dgvSelected.Rows[i].Cells[3].Value.ToString())

几乎可以肯定的是,对于抛出异常的i的特定值,没有dgvSelected.Rows[i].Cells[3]。在该行上设置断点并检查dgvSelected.Rows[i].Cells.Length

答案 2 :(得分:0)

您只向dgvSelected添加一行。我假设,其中有其他行,在其他地方添加了较少的列。检查您访问dgvSelected的所有位置,并确保不添加少于4列的行 您只需使用调试器来检查问题究竟是什么。

答案 3 :(得分:0)

因为,其他人已经给出了“广泛”的答案。我会建议一个更“苗条”的答案。

将下面的代码行添加为循环中的第一行,控制台输出将为您提供最正确的解决方案。

if(dgvSelected.Rows[i].Cells[3].Value==null){
   Console.Writeline(String.Format("Row Index:{0}, Column Index:3 has an unexpected null value. Ignoring this row.", i)
   continue;
}

因为,查看代码时,Row / column对象似乎不太可能为null。 一切顺利。