当提示对话框点击取消时,DataGridView会删除当前选中行,当点击确定时,DataGridView会删除当前选中行和选中行下面一行。我单步跟踪了一下,在这个函数结束后dataGridViewLightLevel.Rows中的数据还是正确的,不知道在什么地方又删除了一行。请大家帮忙看看
代码如下,使用的是VS2010+.Net Framework 4.0       
 void dataGridViewLightLevel_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            DialogResult diaR = MessageBox.Show("是否删除该行?","确认",MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
            if (diaR == DialogResult.OK)
            {
                //e.Cancel = false;
                foreach (DataGridViewRow r in dataGridViewLightLevel.SelectedRows)
                {
                    if (r.IsNewRow == false)
                    {
                        dataGridViewLightLevel.Rows.Remove(r);
                    }
                }
            }
        }

解决方案 »

  1.   

    不要正向删除,那样每次总数都会变化,定位错误,用for循环,从后往前判断删除
      

  2.   

    代码修改如下,仍然会有问题
            void dataGridViewLightLevel_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
            {
                DialogResult diaR = MessageBox.Show("是否删除该行?","确认",MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
                if (diaR == DialogResult.OK)
                {
                    //e.Cancel = false;
                    for (int i = dataGridViewLightLevel.SelectedRows.Count; i > 0; i--)
                    {
                        DataGridViewRow r = dataGridViewLightLevel.SelectedRows[i - 1];
                        if (r.IsNewRow == false)
                        {
                            dataGridViewLightLevel.Rows.Remove(r);
                        }
                    }
                }
            }
      

  3.   

    你有foreach估计就可以了,
    或是
    for (int i = 0; i <Count; i++)
    {
    Delete;//删除方法
    i--;
    }
                           
      

  4.   

    我也觉得用foreach会报错才对啊
      

  5.   

    你不用写自己的删除代码,dgv已经自己触发删除操作了。
    你再删除一行,当然是一下删除两行了。
      

  6.   

    既然放在UserDeletingRow事件中,那你必须阻止事件冒泡,设置e.Cancle=true或e.Handle=true,自己看看是否有类似属性。