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);
}
}
}
是不是因为已经在本行,所以不能删除本行记录?请问有什么解决方法吗?
谢谢各位!
我执行删除操作时,报错:“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);
}
}
}
是不是因为已经在本行,所以不能删除本行记录?请问有什么解决方法吗?
谢谢各位!
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);
}
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;
}
}
}
GridView里面DataKeyNames="pay_id" 设定主键
<asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False"
CommandName="Delete" OnClientClick="return confirm('你确定要删除?')" Text="删除" ></asp:LinkButton>
此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);
} }
}