datagridview动态绑定列,每一列动态绑定一删除button,点击某一行的button就删除本行。
我执行删除操作时,报错:“Uncommitted new row cannot be deleted.”
代码如下:private void Mat_Data_CurrentCellChanged(object sender, EventArgs e)
        {
            if (Mat_Data.CurrentCell != null)
            {
                //如果选择的栏位名称是“delete”,则删除当前行。
                if (this.Mat_Data.Columns[Mat_Data.CurrentCell.ColumnIndex].Name == "delete") 
                {
                    //MessageBox.Show(Mat_Data.Name + ";" + Mat_Data.CurrentRow.ToString());
                    Mat_Data.Rows.RemoveAt(Mat_Data.CurrentRow.Index);
                }
            }
        }
是不是因为已经在本行,所以不能删除本行记录?请问有什么解决方法吗?
谢谢各位!

解决方案 »

  1.   

    你把删除方法写在 datagridview 的 那个删除的时间里面,事件的名字我忘了,就能实现了。还有,你换个简单点的思路撒,数据列表放一行删除按钮,点删除后调到确认删除页面,你把选中行的
    ID传到删除确认页面,然后对数据库进行删除操作,成功后调到列表页面。这样过程麻烦点,但是操作起来
    更简单。
      

  2.   

    ((DataTable)this.Mat_Data.DataSource).Rows.RemoveAt(Mat_Data.CurrentRow.Index);
      

  3.   

    to HooverHuang:请问是这样建立CLICK事件吗?那么ID参数如何传递呢?
    if (this.Mat_Data.Columns[Mat_Data.CurrentCell.ColumnIndex].Name == "delete" )
    {
       // Mat_Data.Rows.RemoveAt(Mat_Data.CurrentRow.Index);
        btn_Del.Click += new EventHandler(btn_Del_Click);
    }
      

  4.   

    删除行的问题解决了一部分,可以执行删除:使用dataGridview的cellContentClick事件
    private void Mat_Data_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                if (e.ColumnIndex == Mat_Data.Columns["delete"].Index)
                {
                    Mat_Data.Rows.RemoveAt(e.RowIndex);
                }
            }
    但问题还是发生:“Uncommitted new row cannot be deleted.” ,请问该如何解决呢?主要是由于命名为Mat_Data的dataGridview里有动态绑定的其它控件,用CurrentCellChanged绑定数据,当执行cellContentClick时,绑定控件选出的值判断
    当前行Mat_Data.CurrentRow.IsNewRow=true,是不触发的原因吧?
    private void Mat_Data_CurrentCellChanged(object sender, EventArgs e)
            {
                if (Mat_Data.CurrentCell != null)
                {
                    if (this.Mat_Data.Columns[Mat_Data.CurrentCell.ColumnIndex].Name == "ass_no")
                    {
                        //bindcombox datasource
                        DataTable ass_no1 = (new SettingMatDataDataAccess()).getMatConTableByStc_id(Convert.ToInt32(cstc_id)).Tables[0];
                        cmb_Mat.DisplayMember = "ass_no";
                        cmb_Mat.ValueMember = "ass_no";
                        cmb_Mat.DataSource = ass_no1;
                        DataRow dr = ass_no1.NewRow();
                        dr["ass_no"] = "===請選擇===";
                        ass_no1.Rows.InsertAt(dr, 0);
                        // 将下拉列表框加入到DataGridView控件中
                        Mat_Data.Controls.Add(cmb_Mat);
                        Rectangle rect = Mat_Data.GetCellDisplayRectangle(Mat_Data.CurrentCell.ColumnIndex, Mat_Data.CurrentCell.RowIndex, false);
                        cmb_Mat.Left = rect.Left;
                        cmb_Mat.Top = rect.Top;
                        cmb_Mat.Width = rect.Width;
                        cmb_Mat.Height = rect.Height;
                        cmb_Mat.Visible = true;
                    }
               }
    }
      

  5.   

    为什么不用datagridview的rowcommand事件呢,很方便的
      

  6.   


     GridView里面DataKeyNames="pay_id" 设定主键
           <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" 
                            CommandName="Delete" OnClientClick="return confirm('你确定要删除?')" Text="删除" ></asp:LinkButton>
      

  7.   

    删除方法写在GridView1_RowDeleting事件里面 应该行·
      

  8.   

    6,7,8,9楼的XDJM:
      此datagridview使用的是winform的,因此没有这些事件。
    我使用间接的方法解决此问题,就是让本行全部填写完毕再执行删除,这样就会有触发的值使其自动向下增一行。
    private void Mat_Data_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                int flag = 0;
                if (e.ColumnIndex == Mat_Data.Columns["delete"].Index)
                {
                    for (int i = 0; i < Mat_Data.Columns.Count - 1; i++)
                    {
                        if (Mat_Data.Rows[e.RowIndex].Cells[i].Value == null)
                        {
                            flag = 1;
                        }
                    }
                    if (flag == 1)
                    {
                        MessageBox.Show("请将本行数据填写完整,再做删除动作!");
                    }
                    else
                    {
                        Mat_Data.Rows.RemoveAt(e.RowIndex);
                    }            }
            }