3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.Net)DataGridView でソートをかけると DataGridViewRow の Tag プロパティが null になる

DataGridView.Sort メソッドで DataGridView 内部の DataGridViewRow に対してソートをかけると、DataGridViewRow.Tagプロパティが null になってしまうようです。

なので、下記のようなコードを書くと Console.WriteLine メソッドのところで例外が発生します。

'DataTable

Private mTable1Dtbl As New Database1DataSet.table1DataTable()

'TableAdapter

Private mTable1Adp As New Database1DataSetTableAdapters.table1TableAdapter()

'DataTableにDBの情報を取得し、DataGridViewにバインドさせる

mTable1Adp.Fill(mTable1Dtbl)

Me.DataGridView1.DataSource = mTable1Dtbl

'DataGridViewRow.Tag プロパティに値代入

Dim j As Integer = 0

For Each row As DataGridViewRow In DataGridView1.Rows

row.Tag = j

j += 1

Next

'ソート

DataGridView1.Sort(DataGridView1.Columns("name2"), System.ComponentModel.ListSortDirection.Descending)

Console.WriteLine("")

For Each row As DataGridViewRow In DataGridView1.Rows

'ここで例外が発生する!!!!!!!!

Console.WriteLine(row.Tag.ToString())

Next

もしかしたら、DataGridView.Sort メソッドは内部的に新しい DataGridViewRow を作ってるのかもしれません。

DataGridView にバインドするオブジェクトを DataView にして、 DataView 上でソートをかけてみましたが、これも結果は同じでした。

まあ、暇があれば、MSから .Net Framework のソース落としてきて調べてみようと思います。

この現象は、知らないとバグの元になっちゃいますね。

こう考えると、Control.Tag はあんまり使わない方がいいんでしょうかね。

(複数人で開発してると、ちゃんと取り決めを設けずに好き勝手に Tag にデータ入れるとわけわからなくなる場合もありますしね。)