int解析DataGridView行值时异常

本文关键字:异常 解析 DataGridView int | 更新日期: 2023-09-27 18:08:04

下面代码的目的是总结在订单系统中会不断添加的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。表中有多行,但它只能读取第一行。当涉及到有值的第二行时,它会显示有关的错误。

int解析DataGridView行值时异常

当然编程语言没有错。它向您报告您正在尝试使用实际上为空的对象引用。

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

正如你所看到的,你应该做很多检查来确保这些对象都不是空的

编辑:删掉其中一些,正如在注释中正确指出的那样,如果这些为空,则不会进入循环。

是你,这一行有些东西是空的

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

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

您只向dgvSelected添加一行。我假设,这里还有其他的行,添加在其他列更少的地方。检查您访问dgvSelected的所有地方,并确保没有添加少于4列的行。
您可以简单地使用调试器来检查问题究竟是什么。

因为,其他人已经给出了一个'宽泛'的答案。我建议一个"可能"的答案。

将以下代码行作为循环中的第一行追加,控制台输出将给您正确的解决方案。

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对象似乎不太可能为空。祝你一切顺利。