从c#中的datagridview中删除数据

时间:2014-01-16 08:07:24

标签: c# datagridview

 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,我无法理解任何人对此有所了解的原因?

4 个答案:

答案 0 :(得分:0)

你不应该缓存长度:

for (int i = 0; i <= dataGridViewLay.RowCount-1; i++)
{
...
}

关于NullReferenceExceptionlayDate如果在任何RowCell[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引用异常
因此,请尝试找出您获得此行为的行

了解详情Null Refernce Exception

试试这个

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关键字)。这样可以避免行数与缓存的行数不相同。