気になった事を自由に書いてます。
      
DataGridViewのSelectionChangedイベントの注意点
SelectionChangedはセルの選択または選択解除を行うたびに発生するイベントです。
このイベント内でカレントセルの情報を取得すると思ってもない値が入ってて
びっくりするかもしれません。

ユーザがマウスのクリックなどでセルを選択、例えば(1, 2)セルを選択し、
カレントセルを取得するとRowIndex=1, ColumnIndex=2となります。想定した値です。
ところが、プログラムでセル選択するとRowIndex、ColumnIndexをうまく取得できません。
カレントセル(1, 1)の状態からプログラムで選択状態を解除して(1, 2)を選択します。
カレントセルはRowIndex=1, ColumnIndex=2だと思うじゃないですか?
でも実際はRowIndex=1, ColumnIndex=1となっています。

サンプルプログラム
1
2
3
4
5
6
7
8
9
10
11
12
13

private void button1_Click(object sender, EventArgs e)
{
    dataGridView1.ClearSelection();
    dataGridView1[1, 2].Selected = true;
}

private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
    DataGridView dgv = sender as DataGridView;
    DataGridViewCell cell = dgv.CurrentCell;

    Console.WriteLine("(" + cell.RowIndex + " , " + cell.ColumnIndex + ")");
}
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 イベントのほうが よいのかも。

      






Copyright (C) 2011 - 2017 猫の気ままなC#日記