Вот мой DataGridView:VB.NET: Как избежать/запретить DataGridView SelectionChange событие из-за обработки?
Me.DGV_InvoiceContainers.MultiSelect = False
Me.DGV_InvoiceContainers.ReadOnly = True
Me.DGV_InvoiceContainers.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect
...
Он содержит один столбец и несколько строк. При нажатии на ячейку/строку (отличную от выбранной) выполняется логический тест (в разделе «Обработчик событий MouseDown»), чтобы убедиться, что все условия выполнены до изменения выбора. Если нет, событие SelectionChanged не может быть поднято/обработано, ничего не может произойти (например, при нажатии кнопки «Отмена»).
Возможно ли это?
Решено:
Private Sub DGV_InvoiceContainers_RowValidating(sender As Object, e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DGV_InvoiceContainers.RowValidating
If Me.CurrentInvoice.IsOpen Then
If Me.CurrentInvoice.ChangesHaveBeenMade Then
Dim dialogResult As New DialogResult
dialogResult = MessageBoxA.Show("Do you want to save changes?", "Question", _
MessageBoxAAutoFill.Title, _
MessageBoxAButtons.YesNoCancel, Library.MessageBoxAMode.Question, MessageBoxAButtonsAlignment.Right, _
MessageBoxA.DialogResultButtons.Button1, {"&Save", "Do ¬ save", "&Cancel"})
Select Case dialogResult
Case Windows.Forms.DialogResult.Yes
Me.Reader.Close()
Me.SaveChanges()
Me.InvoiceContainerSelectionAllowed = True
Case Windows.Forms.DialogResult.No
Me.Reader.Close()
Me.InvoiceContainerSelectionAllowed = True
Case Else
Me.InvoiceContainerSelectionAllowed = False
End Select
Else
Me.Reader.Close()
Me.InvoiceContainerSelectionAllowed = True
End If
'
If Me.InvoiceContainerSelectionAllowed Then
Me.DisposeInvoiceData()
End If
Else
Me.InvoiceContainerSelectionAllowed = True
End If
If Not Me.InvoiceContainerSelectionAllowed Then
e.Cancel = True
Return
End If
End Sub
Спасибо! Оно работает. – LowLevel
Но все же есть еще одна проблема. Когда я щелкаю правой кнопкой мыши по ячейке (отличной от выбранной), она также выбирает ячейку. Таким образом, когда левый клик проходит через OnRowValidating, решение работает, но когда щелчок правой кнопкой мыши проходит через него, он не работает или, может быть, не проходит. – LowLevel
Я заменил тестовый цикл на событие CellLeave. Только e.Cancel остается в событии OnRowValidation. – LowLevel