KM999 Ответов: 1

System.invalidoperationexception: "операция недопустима, поскольку она приводит к повторному вызову функции setcurrentcelladdresscore".


datagride с 3 колонками колонки 0 и 2 можно редактировать ....когда пользователь вводит значение в столбец 0 и нажимает enter, оно переходит в столбец 2, и этот столбец находится в режиме редактирования ...

генерация ошибок
"System.InvalidOperationException: 'Operation is not valid because it results in a reentrant call to the SetCurrentCellAddressCore function.


Что я уже пробовал:

Private Sub DgvData_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DgvData.CellEndEdi

Dim iColumn = DgvData.CurrentCell.ColumnIndex
Dim iRow = DgvData.CurrentCell.RowIndex

If DgvData.Columns.Count = 3 Then
If iColumn = DgvData.ColumnCount - 1 Then
If iRow < DgvData.RowCount - 1 Then
DgvData.CurrentCell = DgvData(0, iRow + 1)
DgvData.BeginEdit(True)
                End If
            Else
                If iRow < DgvData.RowCount - 1 Then
                    SendKeys.Send("{Up}")
                End If
If DgvData.Rows(iRow).Cells(0).Value.ToString = "" And DgvData.RowCount - 1 = 0 Then
                    DgvData.CurrentCell = DgvData(0, 0)
                    DgvData.BeginEdit(True)

Else
                    DgvData.CurrentCell = DgvData(iColumn + 2, iRow)
                    DgvData.BeginEdit(True)
End if
End if
End if

Richard MacCutchan

Вы пытаетесь отредактировать данные внутри своего обработчика редактирования. Вы не можете этого сделать, так как это приведет к повторному вызову обработчика изнутри обработчика, что приведет к вызову обработчика ...

KM999

можете ли вы предоставить код обработчика EndEdit

Richard MacCutchan

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

1 Ответов

Рейтинг:
1

OriginalGriff

Слово, которое вы ищете, - это "рекурсия", и оно не допускается в этом контексте.
Вы не можете использовать "BeginEdit" для того же DGV внутри его обработчика EndEdit (или любого другого обработчика на основе eidt): это может вызвать рекурсивный цикл редактирования, который взорвет ваш стек и приведет к сбою вашего приложения.

Это все равно, что брать деньги из банкомата: это приводит к уменьшению суммы вашего банковского счета. Но если бы был обработчик "уменьшенного банковского счета", который добавлял бы плату за каждое уменьшение, снятие денег вызвало бы его - и это добавило бы плату, которая вызвала бы его снова, и снова, и снова, ... пока сборы не опустошили ваш счет, и банк решил, что вы не можете получить наличные из банкомата для начала.

Подумайте о том, чего вы на самом деле пытаетесь достичь - это не правильный подход!


KM999

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

OriginalGriff

Нет, я не могу - я понятия не имею, что вы ожидаете, что этот код будет делать, или какую задачу вы пытаетесь достичь. У меня также нет никакого доступа к остальной части вашего кода, чтобы получить какое-либо представление о том, как он работает!

Как я уже сказал в своем первоначальном ответе: "подумайте о том, чего вы на самом деле пытаетесь достичь - это неправильный подход!"

KM999

datagride с 3 столбцами столбец 0 доступен для редактирования, а 2-для редактирования ....когда пользователь вводит значение в столбец 0 и нажимает enter, оно переходит в столбец 2, и этот столбец находится в режиме редактирования ...
когда столбец 0 пуст и пользователь нажал enter, введите его сохраненные данные...