DataGridViewのCell移動をEnterで
http://www.vbstation.net/tips/datagridviewenter.htm
http://www.vbstation.net/tips/inherits_control.htm
を参考に作りました。
public partial class DataGridViewEx : DataGridView { public DataGridViewEx() { InitializeComponent(); } protected override bool ProcessDialogKey(Keys keyData) { if ((keyData & Keys.KeyCode) == Keys.Enter) return ProcessRightKey(keyData); else return base.ProcessDialogKey(keyData); } protected override bool ProcessDataGridViewKey(KeyEventArgs e) { if (e.KeyCode == Keys.Enter) return ProcessRightKey(e.KeyData); else return base.ProcessDataGridViewKey(e); } public new bool ProcessRightKey(Keys keyData) { DataGridViewCellCollection currentCells = Rows[CurrentCell.RowIndex].Cells; if (SetValuableCell(currentCells, CurrentCell.ColumnIndex + 1)) return true; if (CurrentCell.RowIndex < Rows.Count - 1 && SetValuableCell(Rows[CurrentCell.RowIndex + 1].Cells, 0)) { return true; } if (SetValuableCell(currentCells, CurrentCell.ColumnIndex + 1)) return true; if (SetValuableCell(currentCells, 0)) return true; return base.ProcessRightKey(keyData); } private bool SetValuableCell(DataGridViewCellCollection cells, int index) { for (int i = index; i < ColumnCount; i++) { DataGridViewCell cell = cells[i]; if (cell.Visible && !cell.ReadOnly) { CurrentCell = cell; return true; } } return false; } }
追記
実際に使ってみると、DataErrorイベントが発生した場合に、えらく面倒なことになることがわかりました。どうしようかなあ。