You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中DataGridView多行删除异常:XML文件仅删最后选中行及后续行

DataGridView多行删除XML数据源问题修复

问题原因

  1. 匹配节点错误:循环中判断XML节点时,误用CustomersInformation.CurrentRow的手机号,而非当前遍历的选中行的手机号,导致所有删除操作都指向同一行记录。
  2. 重复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 17:00:11