Как поместить курсор в начало текста при редактировании ячейки DataGridView программно, когда пользователь начинает редактировать текст ячейки? - PullRequest
6 голосов
/ 13 декабря 2011

Я использую DataGridView, который получает данные из DataTable для редактирования некоторого количества данных. Все вроде нормально, но есть некоторые неудобства. Когда пользователь начинает редактировать ячейку, текст этой ячейки автоматически выделяется, и курсор перемещается в конец текста ячейки. Я хочу поместить курсор (курсор) в начало текста при редактировании ячейки программно, когда пользователь начинает редактировать текст ячейки. Я попробовал:

private void gridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        DataGridViewTextBoxEditingControl dText = (DataGridViewTextBoxEditingControl)e.Control;
        dText.Select(0, 0);
    }

Это не работа. Также я попытался отменить выбор текста в CellBeginEdit - тоже безрезультатно.

1 Ответ

10 голосов
/ 15 декабря 2011

Я бы ожидал, что ты сделал, чтобы работать тоже.Но DataGridView - это сложный элемент управления со многими событиями, и зачастую он не работает интуитивно.Кажется, что когда происходит событие EditingControlShowing, элемент управления еще не инициализирован, поэтому вы не можете на него повлиять.И когда происходит событие CellBeginEdit, элемент управления еще даже не создается.

Должен быть и, вероятно, лучший способ сделать это, но я заставил его работать, используя событие CellEnter:

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
    if (dgv.CurrentCell.EditType == typeof(DataGridViewTextBoxEditingControl))
    {
        dgv.BeginEdit(false);            
        ((TextBox)dgv.EditingControl).SelectionStart = 0;
    }
}

Поэтому, когда ячейка введена, я просто перехожу прямо в режим редактирования, но я передаю false в BeginEdit(), который говорит ей не выбирать никакой текст.Теперь элемент управления редактированием полностью инициализирован, и я могу установить SelectionStart в ноль, чтобы переместить курсор в начало текста.

Если ячейка не является текстовым полем, я ничего не делаю.

Если хотите, вы можете сделать

dgv.EditMode = DataGridViewEditMode.EditProgrammatically;

, чтобы иметь полный контроль над началом редактирования, но я считаю, что в этом нет необходимости.

...