汇总具有相同行ID的行

时间:2014-06-28 15:59:23

标签: c# windows

我有一个项目,我正在尝试将相同ID的行汇总在一起。

例如:

ID    Quantity

1     5 
1     7
2     10
2     18
1     8

所以,当我按下一个按钮时,ID 1下的数量将给我20,而对于ID 2,我将获得28。 但是我遇到了一个错误,指出“对象引用未设置为对象的实例”。以下是我的代码:

id = int.Parse(row.Cells[0].Value.ToString()); 

这是显示错误消息的代码:

int id = 0;
int qty = 0;
List<QuantityPerID> qtyList = new List<QuantityPerID>();

QuantityPerID qtyObj;

foreach (DataGridViewRow row in dataGridView1.Rows)
{
    id = int.Parse(row.Cells[0].Value.ToString());
    qty = int.Parse(row.Cells[1].Value.ToString());
    qtyObj = new QuantityPerID();
    bool ifexists = false;

    if (qtyList != null && qtyList.Count() > 0)
    {
        if (qtyList.Where(q => q.ID == id).Count() > 0)
        {
            ifexists = true;
        }
    }
    if (ifexists)
    {
        qtyObj = qtyList.Where(q => q.ID == id).First();
        qtyObj.Quantity += qty;
    }
    else
    {
        qtyObj.ID = id;
        qtyObj.Quantity = qty;

        qtyList.Add(qtyObj);
    }
}

我想问一下,还有其他更简单的方法可以达到相同的效果吗?

2 个答案:

答案 0 :(得分:1)

您确定Cells[0]Cells[1]不是空的吗?你在它的值上调用ToString。在调用ToString

之前检查Value是否为null
if( null != row.Cells[0].Value )
{
    id = int.Parse(row.Cells[0].Value.ToString());
}

if(null != row.Cells[1].Value)
{
    qty = int.Parse(row.Cells[1].Value.ToString());
}

你看到行尾的空行吗? DataGridView.AllowUserToAddRows属性是否设置为true?
如果是这样,那就是问题所在。您还在读取空行的值 您可以使用for循环

来代替foreach
// notice the Count - 1. 
for(var index = 0; index < dataGridView1.Rows.Count - 1; ++index)
{
    // your code here
}

答案 1 :(得分:0)

拆分此定义

id = int.Parse(row.Cells[0].Value.ToString()); 

分成多个部分,看看是什么产生了NullReferenceException(也可能是Qty)。

或者,在运行时,您可以检查单元格&#39;使用IntelliSense的值(如果你悬停在&#34; Cells&#34;或&#34; row&#34;它将显示它们的内容&#34;。