这个问题我第三次问了。
首先,我的DataGridView是不绑定数据的,是用来输入数据以保存的,所以我设定它的属性是可以添加行,删除行。
现在添加行可以实现了。DataGridView.Rows.Add()方法就能在末尾添加一新行。
但是却无法删除。刚开始时用DataGridView.Rows[i].Remove()方法竞然还出错“无法删除未提交的新行”,后来参考了一位大哥的,在前面加一行DataGridView.EndEdit();不出错了,但还是无法删除。
看我的代码:
 private void button1_Click(object sender, EventArgs e)
        {
            dgvList.EndEdit();
            dgvList.DataSource = null; 
            for (int i = 0; i < dgvList.Rows.Count-1; i++)
            {                
                dgvList.Rows.Remove(dgvList.Rows[i]);                            }
           
        }
这是个清空的按钮,只是测试一下,不想用DataGridView.Rows.Clear(),因为不是每行都要删除的,我要的功能就是符合条件的留下来,不符合的才删除。
现在又出个新问题,就是用循环竞然不能一次性删除,非要运行好几次,才删除完。
我郁闷死了,哪位大侠帮帮我,为这问题我苦恼了好几天了。
请认真看完后再做回答,如果你的回答就是一句DataGridView.Rows[i].Remove(),我服了你了。

解决方案 »

  1.   

    可以试着换种控件使用呀,比如用REPEATER,这个可以动态绑定数据库,那么也能很灵活的根据你的需要册除某行了
      

  2.   

    我刚试了,不绑定数据的话,datagridview.rows.remove(datagridview.currentrow)是可以的
      

  3.   

    又或者你非得要用DataGrid View可以在前面添加一个Checkbox控件,通过判断它的Slectedindex是否被选中来判断是否需要删除
      

  4.   

    dataGridView1.Rows.Remove(dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex])
      

  5.   

    DataGridView后面一定会有绑定一个DataSet吧?对那个DataSet操作,然后重新绑定。
      

  6.   

    我的DataGridView真的没有绑定任何数据呀.我说了,这个DataGridView只是用来做数据录入用的,录入完后,点保存时,我会做个判断,将符合条件的行留下来做保存用,不符合的删除.现在我做个测试删除行的按钮都不能完全删除所有行,你说这怎么回事,按上面说的,选取后也不能删除,都是要点几次按钮才全部删除.
      

  7.   

    private void button1_Click(object sender, EventArgs e)
    {
                while(dgvList.Rows.Count-1>0)
                {
                    dgvList.Rows.Remove(dgvList.Rows[i]);
                    
                }
    }}
      

  8.   

    private void button1_Click(object sender, EventArgs e)
    {
                while(dataGridView1.Rows.Count-1>0)
                {
                    dataGridView1.Rows.Remove(dataGridView1.Rows[0]);
                    
                }
    }
      

  9.   

    我的代码,就是不能完全删除不符合条件的记录.
    #region 保存前验证 
            private bool AllowSave()
            {            int icountErr;
                icountErr = 0;
                dgvList.EndEdit();            
                foreach (DataGridViewRow row in dgvList.Rows)
                {
                    
                    if (row.IsNewRow) continue;
                    if (row.Cells[0].Value == null || row.Cells[0].Value.ToString() == "")
                    {
                        dgvList.Rows.Remove(row);
                        continue;
                    }
                    foreach (DataGridViewCell cell in row.Cells)
                    {   
                        //单价或数量,进行验证
                        if (cell.ColumnIndex == 5 || cell.ColumnIndex == 6|| cell.ColumnIndex == 8)
                        {
                            if (!ValidaCell(cell)) ++icountErr;
                        }
                        //检察库存
                        
                    }
                }
                dgvList.Refresh();
                return icountErr == 0;
            }
            private bool ValidaCell(DataGridViewCell cell)
            {
                if (dgvList.Rows[cell.RowIndex].Cells[0].Value == null || dgvList.Rows[cell.RowIndex].Cells[0].Value.ToString() == "")
                    return true;
                if (cell.Value == null || cell.Value.ToString() == "")
                {
                    cell.ErrorText = "   该项不允计留空!";
                    return false;
                }
                System.Text.RegularExpressions.Regex regul = new System.Text.RegularExpressions.Regex(@"^[-]?\d*[.]?\d*$");
                if (!regul.IsMatch(cell.Value.ToString()))
                {
                    cell.ErrorText = "   该项只允许输入数字!";
                    return false;
                }
                else
                {
                    cell.ErrorText = "";                
                }
                if (cell.ColumnIndex == 6 && cell.ErrorText == "")
                {
                    int stockamout = int.Parse(dgvList.Rows[cell.RowIndex].Cells["库存"].Value.ToString());
                    if (int.Parse(cell.Value.ToString()) > stockamout)
                    {
                        cell.ErrorText = "   输入值已超出库存量,最大为[" + stockamout + "]";
                        return false;
                    }
                }
                
                return true;
                
            }
            #endregion
      

  10.   

    刚做了个试验,发现楼主的循环有问题。用下面这个试试while(dgvList.Rows.Count -1 > 0)
    {
        dgvList.Rows.Remove(dgvList.Rows[0]);
    }可以清除所有行。提示:属性是可以添加行时,行的总数包含最后的空行。
      

  11.   

    不好意思,刚看到 chenxdb(菜鳥也瘋狂) 也发了同样的代码~~莫非这就是传说中的**所见略同??
      

  12.   

    我的目的并不是要清除所有行,要清除所有行一句DataGridView.Rows.Clear()就行了.
    我是要做个判断,将符合条件的行留下来做保存用,不符合的删除.那个按钮的循环代码只是用来显示为什么有的行能删除有的行不能删除.
    谢谢各位的支持,但问题依旧存在,会不会是.Net2.0 的Bug?要不要装个.net 3.0?
      

  13.   

    为了验证那段循环程序,我重新建了一个Form,里面只有一个dataGridView和一个按钮.
    按钮代码:
                dgvList.EndEdit();
                dgvList.DataSource = null; 
                for (int i = 0; i < dgvList.Rows.Count-1; i++)
                {                
                    dgvList.Rows.Remove(dgvList.Rows[i]);                            }
    应该没什么逻辑性错误吧.一看就知道要删除所有行,可你运行就怪了,要点几次才能删除所有行,一次只能删除几行.如果跟踪查看dgvList.Rows.Count是正确的.
    唉.发现怪事了.
      

  14.   

    给你个算法,虽然别扭,但还是能解决你这个问题:for(int i=0; i< dgvList.Rows.Count -1;i++)
    {
         if (dgvList.Rows[i].Cells[0].Value == null || dgvList.Rows[i].Cells[0].Value.ToString() == "")
                    {
                        dgvList.Rows.RemoveAt(i--);
                        continue;
                    }     //下面是其他不删除的行的代码
          ······
    }您先试试,如果不行,明天再来看,先回去吃饭了,实在饿得不行了~~~
    今天第一次来csdn,学习了不少东西,希望能与各位一起进步!!
      

  15.   

    dgvList.Rows.RemoveAt(i--) 执行后,原来的第i+1行变为第i行了,continue后操作的是目前的第i+1行,跳过了原来的第i+1行(现在变成第i行了)。唉,有时候一些简单的问题能把人的头弄晕 -_-
      

  16.   

    哦.明白了.改成这样就行.
                dgvList.EndEdit();
                dgvList.DataSource = null; 
                int icount=dgvList.Rows.Count-1;
                for (int i = 0; i < icount; i++)
                {                
                    dgvList.Rows.Remove(dgvList.Rows[i]); 
                }这个在删除一行后,原来的dgvList.Rows.Count就少1了.所以每次只能删除一半.
    哦.哈哈
      

  17.   

    问题终于解决了,其实是非常简单的问题,就是每次删除一行后,行总数会变少,但是那个i++却持续增加,最后只能删除掉原来的一半行.
    非常感谢bingpingzhi() 和各位朋友.
    以下是代码:(两种)
    dgvList.EndEdit();
                dgvList.DataSource = null;
                //DataGridViewRow[] rows= new DataGridViewRow[dgvList.Rows.Count];
                //dgvList.Rows.CopyTo(rows, 0);
                //foreach (DataGridViewRow row in rows)
                //{
                //    if (row.IsNewRow) break;
                //    dgvList.Rows.Remove(row);
                //}
                for (int i = 0; i < dgvList.Rows.Count-1; i++)
                {
                    if (dgvList.Rows[i].IsNewRow) break;
                    dgvList.Rows.RemoveAt(i--);
                }
      

  18.   

    是不是你的AllowDelete属性为false了
      

  19.   

    如果要删除该行,必须要先获取该行的索引ID,然后再进行删除,id = int.Parse(this.dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString());
    这是获取DGV控件选中当前行的ID值!
      

  20.   

           private void button15_Click ( object sender, EventArgs e ) //删除指定记录
                {
                this.dataGridView2.EndEdit();
                /*
                for (int i = 0; i <= dataGridView2.Rows.Count - 1; i++) // 方法1,顺着删,但要i--,修正逻辑指针i的位置
                    {
                    if (dataGridView2.Rows[i].Cells[2].Value.ToString().Trim() == "ok")
                        {
                        dataGridView2.Rows.RemoveAt(i);
                        i--; 
                        // 不用 i-- 只能删除一半,可用 dataGridView2.Rows.RemoveAt(i--) ; 代替这两句
                        // 这是因为,Rows[i]表示第 i 行,他是动态的,比如,datagridview 一共有 5行,第一次,没有删除,dataGridView2.Rows.Count - 1=4
                        // 当运行 i=3时,Rows[i],RemoveAt(i) 可以操作,因第 4 存在了,当删除了3行,此时,datagridview 一共只有有5-3=2行, dataGridView2.Rows.Count - 1还是=4
                        // 此时,当当运行 i=3时,Rows[i],RemoveAt(i) 不可以操作,因该表一共只有2行,第 4不存在了,Rows[3],RemoveAt(3)造成移除错误
                        }
                    }
                */
                for (int i=dataGridView2.Rows.Count - 1;i>=0;i--) // 方法2:倒着删除,不用i--
                    {
                    if (dataGridView2.Rows[i].Cells[2].Value.ToString().Trim() == "ok")
                        {
                        dataGridView2.Rows.RemoveAt(i);
                        //i--;
                         }
                    }
                 }