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イベントが発生した場合に、えらく面倒なことになることがわかりました。どうしようかなあ。