DataGridView редактирование ячеек на WinForms - PullRequest
2 голосов
/ 11 марта 2012

У меня есть проект Windows Form VS2010 .NET 4 со стандартным DataGridView, связанным с источником данных в форме.

Сетка имеет текстовый столбец, который я хочу использовать в качестве точки и редактировать при нажатии символа. Как и обычные текстовые поля / редакторы, когда вы нажимаете на символ, который хотите настроить. Если возможно, я бы также хотел использовать клавиши ВВЕРХ / ВНИЗ для перемещения между строками, но хотел бы, чтобы курсор перемещался в одну и ту же позицию символа, очевидно, в одном и том же столбце без выделения всего текста.

Я пробовал несколько вещей:

DataGridView1.ClearSelection ()

DataGridView1.BeginEdit (False)

BeginEdit просто помещает курсор в конец текста, что означает еще один щелчок для указания позиции символа для редактирования.

Я знаю, что коммерческая сетка, такая как DevExpress, по умолчанию используется для редактирования, в которой вы можете одним щелчком щелкнуть мышью до нужной позиции персонажа, но, очевидно, это стоит денег.

Я пытался в событии DataGridView1_EditingControlShowing

If TypeOf e.Control Is System.Windows.Forms.DataGridViewTextBoxEditingControl Then
        Dim tb As TextBox = e.Control
        tb.SelectionStart = 5
        tb.SelectionLength = 5
End If

Но это ничего не делает.

Я просто пытаюсь убрать два или три щелчка, чтобы добраться до позиции персонажа, которая требует корректировки.

Я еще не просматривал пользовательский столбец данных.

Любые предложения будут с благодарностью.

1 Ответ

2 голосов
/ 11 марта 2012

Нет ничего хорошего из коробки, способ сделать это. Самое близкое - установить 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;
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...