.NET DataTable过滤疑问:如何让原表同步过滤后的结果?
如何将DataTable更新为DefaultView过滤后的结果?
DataView本质是DataTable的视图层,它的过滤、排序操作只会改变显示内容,不会修改底层的DataTable原始数据,所以你看到原表还保留Code='X'的记录是正常的。要让原表同步成过滤后的结果,有两种常用方法:
方法一:从视图生成新表替换原表
通过DataView.ToTable()把过滤后的视图转换成新的DataTable,再替换或合并到原表:
// 从过滤后的DefaultView生成新表 DataTable filteredTable = myDataSet.myTable.DefaultView.ToTable(); // 方案1:清空原表后合并新表数据(保留原表结构、约束) myDataSet.myTable.Clear(); myDataSet.myTable.Merge(filteredTable); // 方案2:直接替换原表(适合不需要保留原表额外配置的场景) myDataSet.Tables.Remove("myTable"); filteredTable.TableName = "myTable"; myDataSet.Tables.Add(filteredTable);
方法二:直接删除原表中不符合条件的行
如果不想生成新表,直接遍历原表删除Code='X'的行(注意要倒序遍历,避免索引错乱):
// 倒序遍历行,防止删除行后索引偏移导致漏删 for (int i = myDataSet.myTable.Rows.Count - 1; i >= 0; i--) { DataRow row = myDataSet.myTable.Rows[i]; // 注意判断Null值,避免空引用异常 if (!row.IsNull("Code") && row["Code"].ToString() == "X") { row.Delete(); } } // 提交所有删除操作 myDataSet.myTable.AcceptChanges();
两种方法的适用场景:
- 方法一适合数据量大、需要快速生成过滤结果,或者原表结构简单的情况;
- 方法二更适合需要保留原表的约束、关系,且数据量不大的场景。
内容的提问来源于stack exchange,提问作者Rich
相关产品推荐
相关产品推荐

