如何删除DataGridView中的多行
本文关键字:DataGridView 何删除 删除 | 更新日期: 2023-09-27 18:04:21
我试图从DataGridView中删除多个选定行。当我尝试下面的代码时,它只会删除选中的几行。例如,我有7行,我选择5个连续的行并按delete键,只有3个被删除。
IEnumerable<DataGridViewRow> dgvrs = from dgvrws in dgvChemicalInv.Rows.Cast<DataGridViewRow>()
where dgvrws.Selected.Equals(true)
select dgvrws;
foreach ( DataGridViewRow dgr in dgvrs )
{
dctchemri = dgr.Cells["DCT_CHEMRI"].Value.ToString();
index = dgvChemicalInv.CurrentRow.Index;
var chemObj = ( from chmObj in DCTProjectNodeObj.Chemicals
where chmObj.DCTChemRI.Equals(dctchemri)
select chmObj ).Single();
if ( sqlCmd.Delete_Chems(this.projID, (csDCTChemicalObj)chemObj) )
{
dgvChemicalInv.Rows.Remove(dgr);
}
if ( dgvChemicalInv.RowCount > 0 )
{
DCTProjectNodeObj.Chemicals.Remove((csDCTChemicalObj)chemObj);
}
else
{
DCTProjectNodeObj.Chemicals = new List<csDCTChemicalObj>();
DO_BtnSaveClickEvent();
}
}
谢谢你,比尔o .
你的代码很难读。不管怎样,我确定问题出在foreach
上。一般来说,不能从foreach循环所针对的集合中删除foreach循环中的项。无论如何,我认为最好的选择是从数据源中删除项目(可能从中继器获取id)并再次绑定中继器
你的代码有点难读,但我认为你把它弄得太复杂了。我建议使用BindingSource
对象之类的东西。它使表管理更加容易。将BindingSource
的数据源设置为表,将DataGridView
的数据源设置为BindingSource
对象,对表的任何更改都会在调用SubmitChanges()
后反映到DataContext
中。
的例子:
MyDataContext dataContext = new MyDataContext();
BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = dataContext.MyTable;
dataContext.DataSource = bindingSource;
我已经有一段时间没有这样做了,但我认为这是最简单的方法。这避免了任何混乱的操作,但是它可能导致外键关系的复杂性。
只是一个可能使事情更简单的方法。
我同意@Massimiliano Peluso;一般来说,我会在一次拍摄中获得所有id,并只进行一次数据库调用,传递要删除的id的逗号分隔列表,而不是每行调用一个,当然,除非有一些其他有效的理由不这样做,但是调用DB 200次,当你可以调用它一次,完成似乎对我来说是不必要的。然后我将重新绑定数据并完成它。