2012-03-10 3 views
2

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

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

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

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 

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

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

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

Любые предложения были бы весьма полезными.

ответ

2

В этом нет ничего хорошего. Ближе всего стоит установить EditMode сетки на EditOnEnter, но это означает, что вам нужно всего два клика, а не три.

Вам нужно будет написать свой собственный тип столбца.

Кто-то сделал именно это here.

Я не проверял, обрабатывается ли этот пример вверх и вниз - если это не так, вы оказались на правильном пути с помощью свойств 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 является частной переменной уровня формы.Обработчик событий для т выглядит следующим образом:

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

Отличный ответ делает основной бит, я искал этого в течение веков. Он не делает бит вниз, но я мог бы изменить его. Любые идеи о получении предыдущей ячейки. –

+0

Я просто доказал это очень быстро, разместив редактирование contrl (из редактирования управления) в частной переменной уровня формы, а затем поместив значение SelectionStart в переменную типа int во время события удаления управления редактированием. Затем один раз за пределами сетки я проверил int, и у него была последняя позиция управления редактированием. Мне потребовалось всего лишь минуту, чтобы проверить, чтобы вы могли легко добавить что-то подобное в подклассы dgv этого примера. –

+0

Спасибо Дэвиду, у меня есть позиция каретки, но когда используется стрелка вверх/вниз, она не переходит в режим редактирования в следующей строке, я не уверен, как установить редактирование, а затем переместить курсор. Я попытался настроить EditMode на EditOnEnter, но это предотвращает редактирование одним щелчком мыши. Извините, бит новичка ... –

Смежные вопросы