我有一个项目,我正在尝试将相同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);
}
}
我想问一下,还有其他更简单的方法可以达到相同的效果吗?
答案 0 :(得分:1)
您确定Cells[0]
和Cells[1]
不是空的吗?你在它的值上调用ToString。在调用ToString
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循环
// 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;。