Wie kann ich programmgesteuert von einer Zelle in einer Datagrid-Ansicht in eine andere wechseln?

Ich muss nur zulassen, dass ein Zeichen in die bearbeitbaren Datagridview-Zellen eingegeben wird (jede zweite Spalte, die ungeraden, kann bearbeitet werden). Wenn der Benutzer in einer dieser Zellen ein zweites Zeichen hinzufügt, bewegt sich der Cursor zur nächsten Zelle nach unten und stellt dort den zweiten Wert ein (erneutes Drücken dieser Taste bewegt sich wieder nach unten usw.). Wenn am unteren Rand des Rasters (der 12. Zeile), sollte es in Zeile 0 verschoben und auch zwei Spalten nach rechts verschoben werden.

Ich habe versucht, dies zu tun:

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;
        }
    }
}

... aber ich bekomme Fehlermeldungen, denen RowIndex und ColumnIndex nicht zugewiesen werden können, da sie schreibgeschützt sind.

Wie kann ich das erreichen?

Vorsichtsmaßnahme: Ich weiß, dass ich auch Logik hinzufügen muss, um zu Spalte 1 zu gelangen, wenn sich diese derzeit am Ende der letzten bearbeitbaren Spalte befindet.

AKTUALISIEREN

Nach der Antwort von Tergiver ist dies das, was ich bisher habe, aber ich weiß nicht, wie ich zur nächsten Zelle vorrücken soll.

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);
}
UPDATE 2

Vielen Dank an alle; Dies ist, was ich verwende, um es so ziemlich zum Laufen zu bringen (ich möchte immer noch dem Benutzer erlauben, einfach die Taste gedrückt zu halten und diesen Wert kontinuierlich in nachfolgende Zellen einzugeben):

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];
        }
    }
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage