Нет ничего хорошего из коробки, способ сделать это. Самое близкое - установить EditMode
сетки на EditOnEnter
, но это означает, что вам нужно всего два щелчка, а не три.
Вам нужно будет написать свой собственный тип столбца.
Кто-то сделал именно это здесь .
Я не проверял, обрабатывает ли этот пример вверх и вниз - если это не так, то вы были на правильном пути со свойствами SelectionStart и SelectionLength, просто возьмите позицию каретки оставленной ячейки и примените ее к новая ячейка.
Оказывается, что установка этих свойств немного сложнее, чем я запомнил (возможно, потому, что в прошлый раз, когда я делал это, я уже использовал пользовательский тип столбца MaskedTextBox).
Код ниже (в c #, но принцип действует для vb.Net, и я могу дать код vb, если вы не можете конвертировать его самостоятельно), работает хорошо - его можно привести в порядок, поместив его в пользовательский элемент управления, но я оставлю это как упражнение:)
Сначала я добавляю обработчик для события EditingControlShowing:
void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
DataGridViewTextBoxEditingControl t = e.Control as DataGridViewTextBoxEditingControl;
current_control = t;
t.Leave += new EventHandler(t_Leave);
}
В приведенном выше методе current_control является частной переменной уровня формы. Обработчик события для t выглядит так:
void t_Leave(object sender, EventArgs e)
{
cell_caret_pos = current_control.SelectionStart;
}
Там снова у нас есть личное поле уровня класса - cell_caret_pos.
Тогда я обнаружил, что для установки SelectionStart и SelectionLength необходимо работать в обработчике событий CellEnter:
private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
dataGridView1.BeginEdit(false);
DataGridViewTextBoxEditingControl editControl =
(DataGridViewTextBoxEditingControl)dataGridView1.EditingControl;
if (cell_caret_pos != 0)
{
editControl.SelectionStart = cell_caret_pos;
editControl.SelectionLength = 0;
}
}