Как я могу принудительно зафиксировать текущую строку из обработчика события редактирования редактирования виртуального несвязанного DataGridView? - PullRequest
2 голосов
/ 08 сентября 2011

Используя пошаговое руководство из [[http://msdn.microsoft.com/de-de/library/15a31akc.aspx]],], я реализовал DatagridView в виртуальном режиме, полностью свободном, в VB 10 Express (мы говорим о WinForms).

Я понимаю, что CommitEdit (DataGridViewDataErrorContexts.Commit) передает содержимое текущей ячейки в кеш данных.

В примере используется фиксация на уровне строк, т.е. он помещает значения в буфер строк до тех пор, пока не останется текущая строка. Только тогда строка добавляется (или обновляется) в хранилище данных. Это именно то, что я делаю тоже.

Вопрос - как программно зафиксировать текущую строку, не покидая ее? (Я хочу зафиксировать всю строку, а не только текущую ячейку.)

Если пользователь покидает строку, существует последовательность событий RowValidating, RowValidated, RowEnter, в которой выполняется обновление хранилища данных. Поэтому одна идея (в настоящее время моя единственная) состояла в том, чтобы просто переустановить, например, CurrentCell в Nothing.

Но я не могу просто установить для свойства DataGridView CurrentCell значение Nothing (или любую ячейку за пределами текущей строки), поскольку я хочу зафиксировать в обработчике события пользовательский элемент управления редактирования, созданный пользовательский столбец, и я вижу исключение System.InvalidOperationException при установке CurrentCell там.

Фактически, это крошечная кнопка справа от поля со списком, то есть я создаю потомка DataGridViewComboBoxCell, который является элементом управления DataGridViewComboBoxColumn потомка. Моя специальная ячейка ComboBox добавляет крошечную кнопку, которая должна зафиксировать текущую строку. К сожалению, обработчик события _Click этой кнопки не может изменить CurrentCell, поскольку DetachEditingControl вызывает исключение.

Очевидно, я должен отложить переназначение CurrentCell, пока не будет обработано все событие _Click. Или что? Как мне это сделать - зарегистрировать пользовательское сообщение Windows SendMessage, которое мне было бы нужно, и переопределить процедуру окна формы, чтобы оно сбрасывало CurrentCell при получении этого сообщения? (Привет?)

Должен быть довольно простой способ позволить DataGridView зафиксировать все изменения, запустив события, которые я обрабатываю для обновления хранилища данных, не так ли?

Надеюсь, понятно, о чем я говорю. У меня пока нет примера компактного кода: (

1 Ответ

2 голосов
/ 12 сентября 2011

Вот надежный способ фиксации текущей строки:

' Optional: mark the current cell as dirty so the current row definetely will be
' commited:
MyDataGridView.NotifyCurrentCellDirty(True)

' Aktuelle Row commiten. Einen besseren Weg als "Keine Zelle selektieren, dann Originalzelle wieder selektieren" kenne ich nicht:
Dim OrigCellAddress As Point = New Point(MyDataGridView.CurrentCellAddress.X, MyDataGridView.CurrentCellAddress.Y)
MyDataGridView.CurrentCell = Nothing
MyDataGridView.CurrentCell = MyDataGridView.Rows(OrigCellAddress.Y).Cells(OrigCellAddress.X)

Проблема с исключением заключалась в последовательности BeginEdit / EndEdit, которую я выполняю в своем обработчике событий RowEnter :(, что привело к косвенному рекурсивному вызову не реентерабельного материала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...