RowState.Added与DataRowVersion.Original的区别及条件差异咨询
嘿,这个问题问得特别好!我来帮你把这几个DataRow的条件拆解得明明白白,尤其是你疑惑的第二个和第一个条件的核心差异:
DataRow三个条件的详细解析
先快速理清三个条件的基础含义
- 条件1:
DataRow.RowState == Added:这个行是刚添加到DataTable里的新行,还没通过AcceptChanges()提交或者同步到数据源(比如数据库)。此时它只有Current版本,完全没有Original版本。 - 条件2:
!DataRow.HasVersion(DataRowVersion.Original):这个行不存在原始(Original)版本——注意,这个范围比条件1要宽,不止新增行才会触发。 - 条件3:
DataRow.RowState == Modified:这个行是从数据源加载进来的原有数据,之后被修改过。此时它同时存在Original(修改前的原始状态)和Current(修改后的最新状态)两个版本。
重点对比:条件1 vs 条件2
简单来说,条件1是条件2的子集——满足条件1的行一定满足条件2,但满足条件2的行不一定满足条件1,具体看这几个典型场景:
1. 新增行场景(两个条件都成立)
当你调用DataTable.NewRow()创建行,然后把它加入DataTable时:
var dt = new DataTable(); dt.Columns.Add("ID", typeof(int)); var newRow = dt.NewRow(); newRow["ID"] = 1; dt.Rows.Add(newRow); // 此时: // newRow.RowState == DataRowState.Added → 条件1成立 // !newRow.HasVersion(DataRowVersion.Original) → 条件2成立
这时候两个条件都符合,也是最常见的场景。
2. 未加入DataTable的独立行(仅条件2成立)
如果你直接用DataRow构造函数创建行,但还没把它加入到任何DataTable中:
var dt = new DataTable(); dt.Columns.Add("ID", typeof(int)); var detachedRow = new DataRow(dt); detachedRow["ID"] = 2; // 此时: // detachedRow.RowState == DataRowState.Detached → 条件1不成立 // !detachedRow.HasVersion(DataRowVersion.Original) → 条件2成立
这个行还不属于任何表,所以不是Added状态,但它确实没有原始版本,条件2会命中它。
3. 特殊操作后的行(仅条件2成立)
还有一些边缘场景,比如你把一个已删除的行撤销删除后,某些情况下也可能出现没有原始版本但RowState不是Added的情况(比如行回到Unchanged但原始版本被清除,不过这种场景比较少见)。
什么时候用哪个条件?
- 如果你的目标是筛选所有已经加入表、等待提交的新增行,用条件1就够了,范围更精准。
- 如果你的目标是筛选所有没有原始版本的行(包括还没加入表的独立行),那就用条件2。
- 条件3则专门用来筛选从数据源加载后被修改过的原有行,这些行有原始状态可以回溯。
内容的提问来源于stack exchange,提问作者Amit Toren
相关产品推荐
相关产品推荐

