2008/02/16(Sat) 11:48:34 編集(投稿者)
■No14370 (しほちゃん★ さん) に返信
> editingcontrolshowingは編集時のイベントだとおもいます・・・・・・・・
編集が開始された事を知るためのイベントではなく、
編集用のコントロールが表示されたことを知るためのイベントです。
このイベント時の e.Control は、DataGridView.EditingControl と同一です。
> しかもe.controlは選択せれているのcellなのでfocusで他のcellはとれないとおもいます。
> 選択されているプロパティではうまくいかなのでは、私の頭がかたいのかもしれません。
編集中は、DataGridView の上に テキストボックス等が重ねて配置されている状態になります。
そのテキストボックスを得るのが、EditingControlShowing です。
# 正確には、DataGridView の上に、パネル(DataGridView.EditingPanel)があり、
# さらにそのパネルの上に、DataGridView.EditingControl があるという構造です。
別のセルをクリックすると、入力モードが解除されるため、その TextBox の Leave が発生します。
さらにセル移動に伴い、CellEnter/CellLeave も発生します。
空のフォームに下記のコードを貼り、[出力]ウィンドウの内容を追跡してみてください。
WithEvents dgv1 As New DataGridView()
WithEvents editor As Control
Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
dgv1.Dock = DockStyle.Fill
dgv1.RowCount = 10
dgv1.ColumnCount = 3
' EditMode によって、EditingControlShowing の発生タイミングが
' 変化しますが、何を選んでも一緒。
dgv1.EditMode = DataGridViewEditMode.EditOnEnter
'dgv1.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2
Controls.Add(dgv1)
End Sub
Sub dgv1_EditingControlShowing(ByVal sender As Object, _
ByVal e As DataGridViewEditingControlShowingEventArgs) _
Handles dgv1.EditingControlShowing
editor = e.Control
End Sub
Sub dgv1_CellEnter(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) _
Handles dgv1.CellEnter
Debug.Print("CellEnter:{{X={0},Y={1}}}", e.ColumnIndex, e.RowIndex)
End Sub
Sub dgv1_CellLeave(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) _
Handles dgv1.CellLeave
Debug.Print("CellLeave:{{X={0},Y={1}}}", e.ColumnIndex, e.RowIndex)
End Sub
Sub editor_Enter(ByVal sender As Object, ByVal e As EventArgs) Handles editor.Enter
Debug.Print("Editor_Enter:" & dgv1.CurrentCellAddress.ToString())
End Sub
Sub editor_Leave(ByVal sender As Object, ByVal e As EventArgs) Handles editor.Leave
Debug.Print("Editor_Leave:" & dgv1.CurrentCellAddress.ToString())
End Sub