代码改变世界

Row.RowState的状态变化。

2012-01-05 09:32  kwjlk  阅读(1069)  评论(0编辑  收藏  举报

此处问题纠结与再次没有好好审视MSDN官方解释。一开始没有去看,等到基本摸到问题的门路的时候发现MSDN官方解释的很翔实。再次汗颜,这里做篇文章,让将会有这方面问题的同学可以早点找到问题根本:

RowState MSDN Page:http://msdn.microsoft.com/en-us/library/system.data.datarowstate.aspx

我有一个很简单的DataRow状态判定函数,为了判定指定的DataRow是否被删除(该行没有在指定的DataTable.Rows中即视为删除)

        void CashDeleted(DataRow dr)
{
if (dr.RowState == DataRowState.Deleted)
{
Console.WriteLine("Cash Deleted!");
}
}

然而,在运行过程中竟然没有达到预想的效果,有些删除事件并不会在控制台输出Cash Deleted!。调试发现,删除过程到if判断时,获取的RowState为Detached。误认为,删除后的行状态为Detached股将此判断更改为判定是否等于Detached状态。在此调试,发现原本可以输出的删除事件竟然没有了效果。于是将此判断改为判定是否等于Deleted或Detached状态。终于可以看到预想效果了,但是心中不甚了了。为何有些是Detached有些是Deleted状态呢?后来通过如下啰哩啰唆的代码测试:

            DataTable db = new DataTable();
db.Columns.Add("Test");
DataRow dr = db.NewRow();
dr.Delete();
dr = db.NewRow();
db.Rows.Add(dr);
dr.Delete();
dr = db.NewRow();
db.Rows.Add(dr);
db.AcceptChanges();
dr.Delete();
dr = db.NewRow();
db.Rows.Add(dr);
dr["Test"] = "ads";
dr.AcceptChanges();
dr.Delete();

发现没有添加到DataTable中的行删除则为Detached,添加之后则为Deleted。到此才想起去看看MSDN对RowState的说明,天啊,人家早就已经说过了(悲剧哉):

Detached 该行已被创建,但不属于任何 DataRowCollection。 DataRow 在以下情况下立即处于此状态:创建之后添加到集合中之前;或从集合中移除之后。
Unchanged 该行自上次调用 AcceptChanges 以来尚未更改。
Added 该行已添加到 DataRowCollection 中,AcceptChanges 尚未调用。
Deleted 该行已通过 DataRow 的 Delete 方法被删除。
Modified 该行已被修改,AcceptChanges 尚未调用。



以上总结仍有失误,请自行测试...(Deleted状态的行依旧在DataTable中,调用了DataTable或该行的AcceptChanges之后,该行状态转变为Detached)