以下代码在处理时给出NullReferenceException。任何人都可以告诉我它为什么会发生,以及如何解决它?提前致谢!这可能是一件非常简单的事情,我在某个地方失踪了。
if (a.Count != 0)
{
foreach(DataGridViewRow row in a )
{
foreach (DataGridViewRow newrow in b)
{
if( row.Cells[0].Value.ToString() == newrow.Cells[0].Value.ToString() &&
row.Cells[1].Value.ToString() == newrow.Cells[1].Value.ToString()) // this is the line that gives the error.
{
a.Remove(row);
}
}
}
}
这两个列表已经在类的顶部声明,所以我不知道为什么它会给出这个错误。
List<DataGridViewRow> a = new List<DataGridViewRow>();
List<DataGridViewRow> b = new List<DataGridViewRow>();
正如所建议的那样,我尝试使用for循环位,它仍然提供相同的异常
这是代码
if (a.Count != 0)
{
for (int i = a.Count - 1; i >= 0; i--)
{
int index1 = i;
for (int k = 0; k < b.Count; k++)
{
int index2 = k;
if (a.ElementAt<DataGridViewRow> (index1).Cells[0].Value.ToString() == b.ElementAt<DataGridViewRow>(index2).Cells[0].Value.ToString() && a.ElementAt<DataGridViewRow>(index1).Cells[1].Value.ToString() == b.ElementAt<DataGridViewRow>(index2).Cells[1].Value.ToString())
{
a.RemoveAt(index1);
}
else continue;
}
}
答案 0 :(得分:3)
要查找空指针异常,请使用调试器。你的一个变量是null。
但是一旦修复了,你就无法在迭代时修改列表。您提供的代码中最简单的解决方案是将foreach
循环更改为for
循环。
来自foreach
的MSDN文档:
foreach语句为数组或对象集合中的每个元素重复一组嵌入式语句。 foreach语句用于迭代集合以获取所需信息,但不应用于更改集合的内容以避免不可预测的副作用。
答案 1 :(得分:1)
您可能有null
Value
,因此ToString()
失败。
答案 2 :(得分:0)
一些可能性:
row.Cells[0]
为空row.Cells[1]
为空row.Cells[0].Value
为空row.Cells[1].Value
为空答案 3 :(得分:0)
您cannot删除正在迭代的集合中的元素。解决方案是将要删除的元素列表存储在另一个列表中,然后在另一个迭代中删除它们。以下是一个解决方案。
//New list that will contain the Objects to be deleted later on.
List<DataGridView> listToDelete = new List<DataGridView>();
if (a.Count != 0)
{
foreach(DataGridViewRow row in a )
{
foreach (DataGridViewRow newrow in b)
{
if( row.Cells[0].Value.ToString() == newrow.Cells[0].Value.ToString() &&
row.Cells[1].Value.ToString() == newrow.Cells[1].Value.ToString())
{
listToDelete.Add(row);
}
}
}
}
foreach (DataGridView d in listToDelete) {
a.Remove(d);
}