C#中DataGridView多行删除异常:XML文件仅删最后选中行及后续行
DataGridView多行删除XML数据源问题修复
问题原因
- 匹配节点错误:循环中判断XML节点时,误用
CustomersInformation.CurrentRow的手机号,而非当前遍历的选中行的手机号,导致所有删除操作都指向同一行记录。 - 重复IO覆盖数据:每次循环都重新加载原始XML文件,前一次的删除修改会被覆盖,最终仅最后一次删除操作生效。
修正后的代码
// 获取所有选中的有效行 var selectedRows = CustomersInformation.SelectedRows .OfType<DataGridViewRow>() .Where(row => !row.IsNewRow) .ToArray(); // 收集需要删除的所有手机号 var targetPhones = selectedRows .Select(row => row.Cells[1].Value.ToString()) .ToHashSet(); // 一次性加载XML并批量删除对应节点 var customersDoc = XDocument.Load(@"customers.xml"); customersDoc.Descendants("Customer") .Where(cust => targetPhones.Contains(cust.Element("PhoneNumber").Value)) .Remove(); // 保存修改后的XML文件 customersDoc.Save(@"customers.xml"); // 批量移除DataGridView中的选中行 foreach (var row in selectedRows) { CustomersInformation.Rows.Remove(row); } // 清除选中状态 CustomersInformation.ClearSelection();
关键优化点
- 批量处理XML:只加载一次XML文件,批量匹配并删除所有目标节点后再保存,避免重复读写导致的数据覆盖问题,同时提升性能。
- 正确关联行数据:从每个选中行提取手机号,确保DataGridView的行和XML中的记录一一对应,删除精准。
- 高效查询:使用HashSet存储待删除手机号,提升XML节点的匹配效率。
内容的提问来源于stack exchange,提问作者sara
相关产品推荐
相关产品推荐

