如何删除DataGridView中含.exe扩展名的行?代码实现求助
如何删除DataGridView中扩展名为.exe的行?
你的代码目前有两个主要问题:一是RemoveAt的语法错误,二是正向遍历行时直接删除会导致集合索引混乱——当你删除一行后,后面的行会自动前移,下一次循环会跳过某些行,甚至抛出InvalidOperationException异常。下面给你两种可靠的解决方案:
方法一:倒序遍历删除行
倒序遍历从最后一行往前处理,就算删除当前行,前面的行索引不会受到影响,不会出现跳过或报错的情况:
// 从最后一行开始倒序遍历 for (int i = dataGridViewgrida.Rows.Count - 1; i >= 0; i--) { DataGridViewRow row = dataGridViewgrida.Rows[i]; // 先判断单元格值不为null,避免空引用异常 if (row.Cells[1].Value != null) { string filePath = row.Cells[1].Value.ToString(); // 用EndsWith精准判断扩展名(忽略大小写,匹配.EXE/.exe) if (filePath.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) { // 先设置文字颜色(如果需要保留这个效果) row.Cells[1].Style.ForeColor = Color.Red; // 删除当前行 dataGridViewgrida.Rows.RemoveAt(i); } } }
方法二:先收集待删除行,再批量删除
这种方法更安全,尤其适合DataGridView绑定了数据源的场景,避免遍历原集合时修改它引发的异常:
// 创建列表收集要删除的行 List<DataGridViewRow> rowsToDelete = new List<DataGridViewRow>(); foreach (DataGridViewRow row in dataGridViewgrida.Rows) { if (row.Cells[1].Value != null) { string filePath = row.Cells[1].Value.ToString(); if (filePath.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) { row.Cells[1].Style.ForeColor = Color.Red; rowsToDelete.Add(row); } } } // 批量删除收集到的行 foreach (DataGridViewRow row in rowsToDelete) { dataGridViewgrida.Rows.Remove(row); }
额外建议:如果DataGridView绑定了数据源
如果你的DataGridView是绑定到DataTable这类数据源,直接操作数据源会更高效,DataGridView会自动刷新:
// 假设数据源是DataTable DataTable dataTable = (DataTable)dataGridViewgrida.DataSource; // 筛选出所有扩展名为.exe的行并删除 var rowsToDelete = dataTable.Rows.Cast<DataRow>() .Where(row => row[1].ToString().EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) .ToList(); foreach (DataRow row in rowsToDelete) { row.Delete(); } // 提交更改 dataTable.AcceptChanges();
关键注意点
- 一定要先判断
row.Cells[1].Value != null,防止空引用异常; - 用
EndsWith代替Contains,避免误删文件名中间包含.exe的文件(比如test.exe.txt); - 避免在
foreach遍历DataGridView.Rows时直接删除行,这会破坏集合的遍历状态。
内容的提问来源于stack exchange,提问作者Marek Pucek
相关产品推荐
相关产品推荐

