RowState の状態遷移

.NetFramework の DataTable 内の行を表す DataRow は、現在状態を RowState で知ることができます。
このプロパティは DataRow に対して操作をすることで刻々と変わっていくわけですが、何をしたらどう変わるのかについてまとめたのが上記の図です。

状態遷移表に下記表すと、下記のようになります。
左端の列が行に対するタスクで、DataRow.RowState の値がそれより右の列のときにそのタスクを実行すると、セル内の値に変わる事を表します。

タスク 開始 Added Deleted Detached Modified Unchanged
DataTable.NewRow() Detached -- -- -- -- --
DbAdapter.Fill() Unchanged -- -- -- -- --
行変更 -- Added DeletedRowInaccessibleException Detached Modified Modified
DataTable.AcceptChanges() -- Unchanged Detached Detached Unchanged Unchanged
DataRow.Delete() -- Detached Deleted Detached Deleted Deleted
DataTable.Rows.Add() -- ArgumentException ArgumentException Added ArgumentException ArgumentException

DataTable.NewRow() で行を作成すると Detached 、 DbAdapter.Fill() で DataTable に値を流し込んだ直後の DataRow は Unchanged になっています。
これに対していろいろ操作していくわけですが、 Added の DataRow を編集しても Added のままであることは、ちょっと注目してもいいかもしれません。
ネット上で公開されているサンプルでは DataTable.NewRow() で新しい行を作成した後、その行に値を設定して、それから DataTable.Rows.Add() でテーブルに行を追加するという流れになっているものがほとんどです。
しかし Added の DataRow を編集しても Added のままですから、 DataTable.NewRow() ⇒ DataTable.Rows.Add() ⇒ 値編集 という流れにしても問題ないことがわかります。
たとえば Fill() してきた DataTable に目的の行があればそれを編集して、なければ新規追加という流れはよくある話でしょう。
これをサンプル通りに書くと行の作成とテーブルへの追加のそれぞれで if 文が必要になりますが、上記の状態遷移を考えると、 if 文は行作成時の一回だけですむことになります。