问题描述
我刚刚开始学C#,现在在做一个项目,在看前人的代码。现在想实现的是,在界面上按按钮删除一些数据,数据库中对应row的数据也删除。privatevoidDeleteSelectedButton_Click(objectsender,EventArgse){if(MessageBox.Show("删除所选记录,你确定吗?","确认删除",MessageBoxButtons.OKCancel,MessageBoxIcon.Warning)==DialogResult.Cancel)return;for(inti=HistoryView.Rows.Count-1;i>=0;i--){DataGridViewRowrow=HistoryView.Rows[i];if(Convert.ToBoolean(row.Cells[0].Value)==true){HistoryView.Rows.RemoveAt(i);}}maOp.manDB.SubmitChanges();}
但是会报“除非DataGridView被数据绑定到支持更改通知并允许删除的IBindingList,否则不能以编程方式移除行。”的错误。我尝试绑定IBindingList如下:HistoryView.DataSource=maOp.GetOldHistory(DateTime.Now);BindingSourcebs=newBindingSource();BindingList<Man_Log>bl=newBindingList<Man_Log>(maOp.GetOldHistory(DateTime.Now));bl.AllowRemove=true;HistoryView.ReadOnly=false;bs.DataSource=bl;HistoryView.DataSource=bs;
又会报错:“集合是只读的”。请教应该怎么弄?谢谢
解决方案
本帖最后由 shichuanwuhan 于 2010-03-26 15:28:15 编辑
解决方案二:
直接删除数据库中的数据,然后重新给DATAGRIDVIEW绑定数据源
解决方案三:
抛出异常try{sqlconnectionsqlconnection=newsqlconnection(连接数据库);//先创建sqlconnection对象,并连接sql数据库this.sqlconnection.Open();//在打开sql数据库连接sqlcommandsqlcommand=newsqlcommand("deletefrom表名",this.sqlconnection)//在创建sqlcommand对象,并写sql语句this.i=this.sqlcommand.ExecuteNonery();//调用sqlcommand的方法if(i!=0)//判断{MessageBox.Show("删除成功!");}else{MessageBox.Show("删除失败!");}}catch(Exceptionex){}finally{this.sqlconnection.Close();//最后关闭}可以试用下
解决方案四:
引用1楼leon9090的回复:
直接删除数据库中的数据,然后重新给DATAGRIDVIEW绑定数据源
我只会删除界面上的条目,不知道如何直接删除数据库里的。是用RemoveAt么?我初学,啥都不会。
解决方案五:
但是会报“除非DataGridView被数据绑定到支持更改通知并允许删除的IBindingList,否则不能以编程方式移除行。”的错误你在用HistoryView这个做XUN环,在其XUN环内部是不能删除它的行的。
解决方案六:
你需要将删除操作提交到数据库
解决方案七:
引用4楼wwx6312388的回复:
但是会报“除非DataGridView被数据绑定到支持更改通知并允许删除的IBindingList,否则不能以编程方式移除行。”的错误你在用HistoryView这个做XUN环,在其XUN环内部是不能删除它的行的。
请教下应该怎么弄呢?我这里必须要用到循环。我没有用DataGridViewRow作循环体,用的是DataGridView的index也不行么?
解决方案八:
引用5楼lost_painting的回复:
你需要将删除操作提交到数据库
就是不会这个。。。能不能写一两句代码让我参考一下?
解决方案九:
我现在知道需要:“在数据源中删除数据,刷新显示控件”。谁能给段小代码如何在数据库中删除数据?我大概明白就结贴了。
解决方案十:
publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privateDataTabledt=newDataTable();privateOdbcDataAdapterda=newOdbcDataAdapter();privatevoidForm1_Load_1(objectsender,EventArgse){OdbcConnectioncn=newOdbcConnection("driver={IBMDB2ODBCDRIVER};Database=SDDT;hostname=223.1.1.19;port=50000;protocol=TCPIP;uid=LLL;pwd=BCL987;CurrentSchema=SDDT;");OdbcCommandcom=newOdbcCommand("select*fromMODEL",cn);da=newOdbcDataAdapter(com);DataTabledt=newDataTable();dt.Locale=System.Globalization.CultureInfo.InvariantCulture;da.Fill(dt);this.dataGridView1.DataSource=dt;}privatevoidgetupdate(){dt=dataGridView1.DataSourceasDataTable;//把DataGridView绑定的数据源转换成DataTableOdbcCommandBuildercb=newOdbcCommandBuilder(da);//将数据放到datatable中datagridview的数据源是datatable//修改datagridview//更新da.Update(dt);}privatevoidbutton1_Click_1(objectsender,EventArgse){this.getupdate();MessageBox.Show("更新成功");}privatevoidbutton2_Click(objectsender,EventArgse){OdbcConnectioncon=Program.createConnection();con.Open();DataSetds=newDataSet();DataTabledt=newDataTable();stringquerysql="select*fromMODEL";OdbcDataAdapterda=newOdbcDataAdapter(querysql,con);da.Fill(ds,"tab");dt=ds.Tables[0];this.dataGridView1.DataSource=dt;con.Close();}privatevoidbutton3_Click(objectsender,EventArgse){introw=dataGridView1.SelectedRows.Count;if(MessageBox.Show("确认删除选中的"+row.ToString()+"条记录吗?","请确认",MessageBoxButtons.YesNo,MessageBoxIcon.Question)==DialogResult.Yes){while(row>0){((DataRowView)dataGridView1.SelectedRows[0].DataBoundItem).Row.Delete();row=row-1;}this.getupdate();MessageBox.Show("删除成功");}}
解决方案十一:
IListlist=(IList)datagridview1.DataSource;list.RemoveAt(datagridview1.CurrentRow.Index);datagridview1.DataSource=null;datagridview1.DataSource=list;因为你绑定的数据源是list等集合,不是datagridview指定的数据源,所以可以帮数据源转为list,再从集合类中remove,最后在绑定就ok