DataGridViewのSelectionChangedイベントの注意点
SelectionChangedはセルの選択または選択解除を行うたびに発生するイベントです。
このイベント内でカレントセルの情報を取得すると思ってもない値が入ってて びっくりするかもしれません。 ユーザがマウスのクリックなどでセルを選択、例えば(1, 2)セルを選択し、 カレントセルを取得するとRowIndex=1, ColumnIndex=2となります。想定した値です。 ところが、プログラムでセル選択するとRowIndex、ColumnIndexをうまく取得できません。 カレントセル(1, 1)の状態からプログラムで選択状態を解除して(1, 2)を選択します。 カレントセルはRowIndex=1, ColumnIndex=2だと思うじゃないですか? でも実際はRowIndex=1, ColumnIndex=1となっています。 サンプルプログラム
MSDNによると
CurrentCell プロパティの値を変更すると、CurrentCellChanged イベントの前に、 SelectionChanged イベントが発生します。このとき、CurrentCell プロパティにアクセスする すべての SelectionChanged イベント ハンドラには、変更前の値が渡されます。 http://msdn.microsoft.com/ja-jp/library/system.windows.forms.datagridview.selectionchanged(v=vs.80).aspx つまり、CurrentCellが変更される前にSelectionChanged イベントが発生するため、 SelectionChanged イベントでCurrentCellの値を取得しても変更前の値になるのです。 CurrentCellを取得するときはSelectionChanged イベントよりCurrentCellChanged イベントのほうが よいのかも。 |