Jak mogę programowo przenieść z jednej komórki w datagridview do innej?

Muszę pozwolić, aby tylko jeden znak został wprowadzony do edytowalnych komórek widoku datagridview (każda inna kolumna, nieparzyste, jest edytowalna); jeśli użytkownik doda drugi znak w jednej z tych komórek, kursor powinien przejść do następnej komórki w dół i umieścić tam drugą wartość (ponowne naciśnięcie tego klawisza przesuwa się w dół ponownie i tak dalej). Jeśli na dole siatki (12 wiersz), powinien przejść do wiersza 0, a także przesunąć dwie kolumny w prawo.

Próbowałem to zrobić:

private void dataGridViewPlatypus_KeyDown(object sender, KeyEventArgs e) {
    var currentCell = dataGridViewPlatypus.CurrentCell;
    int currentCol = currentCell.ColumnIndex;
    int currentRow = currentCell.RowIndex;
    if (currentCell.Value.ToString().Length > 0) {
        if (currentRow < 11) {
            dataGridViewPlatypus.CurrentCell.RowIndex = currentRow+1;
        } else if (currentRow == 11) {
            currentCell.RowIndex = 0;
            currentCell.ColumnIndex = currentCell.ColumnIndex + 2;
            dataGridViewPlatypus.CurrentCell = currentCell;
        }
    }
}

... ale otrzymuję błąd msgs, że RowIndex i ColumnIndex nie mogą być przypisane, ponieważ są tylko do odczytu.

Jak mogę to osiągnąć?

Zastrzeżenie: Wiem, że będę musiał również dodać logikę, aby przejść do kolumny 1, jeśli aktualnie znajduje się na dole ostatniej edytowalnej kolumny.

AKTUALIZACJA

Od odpowiedzi tergiver, to jest to, co mam do tej pory, ale nie wiem, jak przejść do następnej komórki.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
    if (this.ActiveControl == dataGridViewPlatypus)
    {
        var currentCell = dataGridViewPlatypus.CurrentCell;
        if (currentCell.Value.ToString().Length == 1) 
        {
            ;//Now what?
        }
    }
    return base.ProcessCmdKey(ref msg, keyData);
}
AKTUALIZACJA 2

Dziękuje wszystkim; to jest to, czego używam, aby to działało (nadal chcę móc pozwolić użytkownikowi na przytrzymanie klawisza i mieć tę wartość stale wprowadzaną w kolejnych komórkach):

private void dataGridViewPlatypus_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) {
    int columnIndex = (((DataGridView)(sender)).CurrentCell.ColumnIndex);
    if (columnIndex % 2 == 1) {
        e.Control.KeyDown -= TextboxNumeric_KeyDown;
        e.Control.KeyDown += TextboxNumeric_KeyDown;
        e.Control.KeyUp -= TextboxNumeric_KeyUp;
        e.Control.KeyUp += TextboxNumeric_KeyUp;
    }
}

private void TextboxNumeric_KeyDown(object sender, KeyEventArgs e) {
    var tb = sender as TextBox;
    if (tb != null) {
        tb.MaxLength = 1;
    }
}

// TODO: Now need to find a way to be able to just press down once
private void TextboxNumeric_KeyUp(object sender, KeyEventArgs e) {
    var tb = sender as TextBox;
    if (tb != null && tb.TextLength >= 1) {
        if (dataGridViewPlatypus.CurrentCell.RowIndex != dataGridViewPlatypus.Rows.Count - 1) {
            dataGridViewPlatypus.CurrentCell = dataGridViewPlatypus[
                dataGridViewPlatypus.CurrentCell.ColumnIndex,
                dataGridViewPlatypus.CurrentCell.RowIndex + 1];
        } else { // on last row
            this.dataGridViewPlatypus.CurrentCell = this.dataGridViewPlatypus.CurrentCell.ColumnIndex !=    dataGridViewPlatypus.Columns.Count - 1 ? this.dataGridViewPlatypus[this.dataGridViewPlatypus.CurrentCell.ColumnIndex    + 2, 0] : this.dataGridViewPlatypus[1, 0];
        }
    }
}

questionAnswers(4)

yourAnswerToTheQuestion