我正在尝试从DataGridView中删除多个选定的行。当我尝试下面的代码时,它只会删除一些选定的行。一个例子,我有七行,我选择了5行并按删除,只有三行被删除。
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();
}
}
谢谢,
Bill O。
答案 0 :(得分:2)
您的代码很难阅读。无论如何,我确定问题出在foreach
。通常,您无法从正在循环的集合中删除foreach循环中的项目。
无论如何,我认为最好的选择是从数据源中删除项目(可能从转发器获取id)和DataBind再次转发器
答案 1 :(得分:0)
我同意@Massimiliano Peluso;一般情况下,我会一次性获取所有ID并只进行一次数据库调用,通过逗号分隔的ID列表进行删除,而不是每行调用一次,除非当然还有一些其他正当理由不这样做方式但是当你可以调用它一次并且完成时调用DB 200次对我来说似乎没有必要。然后我会重新绑定数据并完成它。
答案 2 :(得分:0)
您的代码有点难以理解,但我认为您的代码太复杂了。我建议使用类似BindingSource
对象的东西。它使表管理更容易。将BindingSource
的{{3}}设置为表格,将DataGridView
的{{3}}设置为BindingSource
对象,对表格所做的任何更改都将反映出来在致电datasource之后DataContext
。
示例:
MyDataContext dataContext = new MyDataContext();
BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = dataContext.MyTable;
dataContext.DataSource = bindingSource;
我已经做了一段时间了,但我认为这是最简单的方法。这可以避免任何混乱的操作,但是它可能导致外键关系的复杂化。
只是一种可以使事情更简单的方法。