Gridview null引用异常c#

时间:2017-04-06 05:22:28

标签: c# gridview

我正在通过以下代码在按钮点击事件中在gridview中添加数据:

            int row = 0;
            dataGridView1.Rows.Add();
            row = dataGridView1.Rows.Count - 2;
            dataGridView1["Description",row].Value = name;
            dataGridView1["Quantity", row].Value = qty.Text;
            dataGridView1["Price", row].Value = p;
            dataGridView1["Discountcell", row].Value = "0000";
            dataGridView1["amt", row].Value = tot;

它的工作非常好。 现在我想要在gridview输入折扣时,折扣应减去总金额。为此,我有以下代码:

foreach (DataGridViewRow item in dataGridView1.Rows)
            {
                int n = item.Index;
               dataGridView1["amt", n].Value = tot - float.Parse(dataGridView1.Rows[n].Cells[3].Value.ToString());
            }

这里给出了以下错误:

  

未处理的类型异常   ' System.NullReferenceException'发生在Sales System1.exe

中      

附加信息:对象引用未设置为的实例   对象

没有这个减法代码数据被添加到gridview中。但是当我把这个代码放在上面时会出现上述错误。我需要做什么?

2 个答案:

答案 0 :(得分:1)

foreach (DataGridViewRow item in dataGridView1.Rows)
{
    float f;
    int n = item.Index;
    if (float.TryParse(dataGridView1.Rows[n].Cells[3].Value.ToString(), out f))
    {
         dataGridView1["amt", n].Value = tot - f;
    }
}

答案 1 :(得分:1)

由于AllowUserToAddRows已设置为true,因此dataGridView1.Rows包含行列表中的编辑器行。

事实上,item周期中分配给foreach变量的最后一个值正是该行(编辑器行)。如果您不想将AllowUserToAddRows设置为false,则可以使用行本身的IsNewRow属性跳过处理该行。

foreach (DataGridViewRow item in dataGridView1.Rows)
{
    if (item.IsNewRow) break;
    dataGridView1["amt", item.Index].Value = tot - float.Parse(item.Cells["Discountcell"].Value.ToString());
}