int rowCount = dataGridViewLay.RowCount-1;
// int columnCount = dataGridViewLay.ColumnCount;
MessageBox.Show(rowCount+" ");
for (int i = 0; i <= rowCount; i++)
{
String layDate = dataGridViewLay.Rows[i].Cells[1].Value.ToString();
if (!layDate.Equals(layDatePicker.Value.ToShortDateString()))
{
// MessageBox.Show("Match Found");
dataGridViewLay.Rows.RemoveAt(i);
}
}
我使用了上面的代码,但是出现了异常;一个NullReferenceException,我无法理解任何人对此有所了解的原因?
答案 0 :(得分:0)
你不应该缓存长度:
for (int i = 0; i <= dataGridViewLay.RowCount-1; i++)
{
...
}
关于NullReferenceException
:layDate
如果在任何Row
中Cell[1]
为空,则可能为空。然后null.ToString()
是一个例外。
这将有效
for (int i = 0; i <= dataGridViewLay.RowCount-1; i++)
if(somecondition)
dataGridViewLay.Rows.RemoveAt(i);
,它等于
for (int i = 0; i < dataGridViewLay.RowCount; i++)
if(somecondition)
dataGridViewLay.Rows.RemoveAt(i);
以某种方式获得相同的结果。这不是最优的,但它有效并且不是错误。
答案 1 :(得分:0)
删除第一行后,当您的计数仍然相同时,行数会减少。你应该从最后迭代。
for (int i = dataGridViewLay.RowCount-1; i >= 0; i--)
答案 2 :(得分:0)
您通过i
引用DatagridView的行,并且您的i
引用了不在DataGridView中的行
开启
dataGridViewLay.Rows.RemoveAt(i);
它指向一个不存在于网格中的行,或者它没有获得必须从Datagridview中删除的行的referance,因此您得到Null引用异常
因此,请尝试找出您获得此行为的行
foreach( DataGridViewRow dgr in dataGridView1.Rows.Cast<DataGridViewRow>().Where(r => r != null).ToList())
{
//remove Those rows Which is not equal to null
}
答案 3 :(得分:0)
这只是一个建议,但是当你找到layDate thingy时,你就可以摆脱循环(break
关键字)。这样可以避免行数与缓存的行数不相同。