如何删除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 .

如何删除DataGridView中的多行

你的代码很难读。不管怎样,我确定问题出在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次,当你可以调用它一次,完成似乎对我来说是不必要的。然后我将重新绑定数据并完成它。