通常はEnterキーを押すとカーソルは次の行に移動してしまいますが、右隣のセルに移動するようにします。
解説
データグリッドビューを継承したユーザーコントロールを作成し、 ProcessDialogKey()とProcessDataGridViewKey()をオーバーライドしてEnterキーが押されたらTabキーの処理に差し替えます。※サンプルでは右下セルでEnterが押されたら次のコントロールに、左上セルでShift + Enterが押されたら前のコントロールにフォーカスを移動させています。 不要であれば削除してください。
サンプルコード
-
C#
EnterMoveDataGridView.Designer.csEnterMoveDataGridView.cspartial class EnterMoveDataGridView { }
public partial class EnterMoveDataGridView : System.Windows.Forms.DataGridView { /// <summary> /// ダイアログ ボックスのキーを処理します。 /// </summary> protected override bool ProcessDialogKey(Keys keyData) { // セルの編集モード時にEnterが押されると次行に移ってしまうので、右隣のセルに移動させる if ((keyData & Keys.KeyCode) == Keys.Enter) { // Tabキーの処理を行う return this.ProcessTabKey(keyData); } // 既定の処理を行う return base.ProcessDialogKey(keyData); } /// <summary> /// DataGridView での移動に使用されるキーを処理します。 /// </summary> protected override bool ProcessDataGridViewKey(KeyEventArgs e) { if (e.KeyCode == Keys.Enter && e.Handled == false) { // イベントを処理済にする e.Handled = true; if (this.CurrentCell != null) { // 右下セルのときは次のコントロールにフォーカス移動 if (this.CurrentCell.RowIndex == this.Rows.GetLastRow(DataGridViewElementStates.Visible) && this.CurrentCell.ColumnIndex == this.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).Index && e.Modifiers != Keys.Shift) { return this.FindForm().SelectNextControl(this.FindForm().ActiveControl, true, true, true, true); } // 左上のセルでShift + Enterが押されたときは前のコントロールにフォーカス移動 if (this.CurrentCell.RowIndex == 0 && this.CurrentCell.ColumnIndex == 0 && e.Modifiers == Keys.Shift) { return this.FindForm().SelectNextControl(this.FindForm().ActiveControl, false, true, true, true); } } // Enterキーが押されらTabキーの処理を行う return this.ProcessTabKey(e.KeyData); } // 既定の処理を行う return base.ProcessDataGridViewKey(e); } }
-
VB.NET
EnterMoveDataGridView.Designer.vbEnterMoveDataGridView.vb<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Partial Class EnterMoveDataGridView Inherits System.Windows.Forms.DataGridView End Class
Public Class EnterMoveDataGridView ''' <summary> ''' ダイアログ ボックスのキーを処理します。 ''' </summary> Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean ' セルの編集モード時にEnterが押されると次行に移ってしまうので、右隣のセルに移動させる If (keyData And Keys.KeyCode) = Keys.Enter Then ' Tabキーの処理を行う Return Me.ProcessTabKey(keyData) End If ' 既定の処理を行う Return MyBase.ProcessDialogKey(keyData) End Function ''' <summary> ''' DataGridView での移動に使用されるキーを処理します。 ''' </summary> Protected Overrides Function ProcessDataGridViewKey(ByVal e As KeyEventArgs) As Boolean If e.KeyCode = Keys.Enter And e.Handled = False Then ' イベントを処理済にする e.Handled = True If Me.CurrentCell IsNot Nothing Then ' 右下セルのときは次のコントロールにフォーカス移動 If Me.CurrentCell.RowIndex = Me.Rows.GetLastRow(DataGridViewElementStates.Visible) AndAlso _ Me.CurrentCell.ColumnIndex = Me.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).Index AndAlso _ e.Modifiers <> Keys.Shift Then Return Me.FindForm().SelectNextControl(Me.FindForm().ActiveControl, True, True, True, True) End If ' 左上のセルでShift + Enterが押されたときは前のコントロールにフォーカス移動 If Me.CurrentCell.RowIndex = 0 AndAlso _ Me.CurrentCell.ColumnIndex = 0 AndAlso _ e.Modifiers = Keys.Shift Then Return Me.FindForm().SelectNextControl(Me.FindForm().ActiveControl, False, True, True, True) End If End If ' Enterキーが押されらTabキーの処理を行う Return Me.ProcessTabKey(e.KeyData) End If ' 既定の処理を行う Return MyBase.ProcessDataGridViewKey(e) End Function End Class
サンプルコードのダウンロード
サンプルコードの実行には Microsoft Visual Studio 2008 以上のバージョンが必要です。 2008以外のバージョンではプロジェクトを開いた際にファイルの変換が必要な場合があります。その場合は変換後に実行してください。検証環境
- Microsoft Visual Studio 2008 Version 9.0.30729.4462 QFE Edition: Professional
- Microsoft .NET Framework Version 3.5 SP1
- Microsoft Windows 7 Professional Service Pack 1 (Microsoft Windows NT 6.1 (7601))