DataGridView多行删除异常:转移行至子表后仅最后一行被删除
问题原因
直接遍历dataGridView1.SelectedRows集合并删除行时,这个集合是动态更新的——每删除一行,SelectedRows的元素就会自动减少一个,导致正向遍历过程中跳过部分行,最终只有最后一行被删除。
解决方案
有两种可靠的修复方式:
方法1:先将选中行存入静态集合再删除
把动态的SelectedRows复制到静态列表中,再遍历静态列表执行删除操作,避免原集合变化干扰遍历:
if (dataGridView1.SelectedRows.Count == dataGridView1.Rows.Count) { dataGridView1.Rows.Clear(); } else { // 先把选中行存入静态列表,隔离动态集合的变化 List<DataGridViewRow> selectedRows = new List<DataGridViewRow>(); foreach (DataGridViewRow row in dataGridView1.SelectedRows) { selectedRows.Add(row); } // 遍历静态列表删除行 foreach (DataGridViewRow row in selectedRows) { dataGridView1.Rows.Remove(row); } }
方法2:倒序遍历选中行
从最后一行开始往前删除,这样删除当前行后,不会影响未遍历的行索引:
if (dataGridView1.SelectedRows.Count == dataGridView1.Rows.Count) { dataGridView1.Rows.Clear(); } else { // 从最后一个选中行开始倒序遍历 for (int i = dataGridView1.SelectedRows.Count - 1; i >= 0; i--) { DataGridViewRow row = dataGridView1.SelectedRows[i]; dataGridView1.Rows.Remove(row); } }
内容的提问来源于stack exchange,提问作者elbays
相关产品推荐
相关产品推荐

