VB.NET で画面の表にバインドしているデータテーブルの中身を、編集前、編集後の値で比較してほげほげしたいという処理がある。
データテーブルのレコード自体は、編集前のものであれば列名の後ろに DataRowVersion.Original というバージョン情報を引数で設定してやればいい。
編集前は dr("人数", DataRowVersion.Original) 、編集後の値は dr("人数") という具合
そこで、例えば職種をキーとしたハッシュテーブル(連想配列)に編集前と編集後の人数をセットしていって、あとで同じキー(同じ職種)の人数の変異を見たいと思って、
For Each dr As DataRow In DataTable1.RowsHTOld(dr("職種", DataRowVersion.Original).ToString) = dr("人数", DataRowVersion.Original).ToStringHTNew(dr("職種").ToString) = dr("人数").ToStringNext
なんてやると、編集前の値のない行(つまり、追加された行)データが出てくると、
System.Data.VersionNotFoundException: 'アクセスする Original データがありません。'
という例外が発生する。
Not IsDBNull(dr("職種", DataRowVersion.Original)) とかしたら回避できるかなとも思ったけど、データがそもそも無いので Null でもない。
Try で例外引っ掛けて、それを「オリジナル行のない追加されたデータである」と判断してもいいかなとも思ったが、結局、RowState をチェックすることで回避した。
If dr.RowState <> DataRowState.Added ThenHTOld(dr("職種", DataRowVersion.Original).ToString) = dr("人数", DataRowVersion.Original).ToStringEnd IfIf dr.RowState <> DataRowState.Deleted ThenHTOld(dr("職種") = dr("人数").ToStringEnd If
みたいな感じ。
他にきれいなやり方があるのなら教えてほしい>VB.NET マスターの皆さん
Perl 使いの俺としては、こういう処理で引っかかるの、本当に面倒くさくていや(笑)