VB.NET: как избежать/запретить обработку события DataGridView SelectionChange?

Вот мой DataGridView:

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 &not 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

person LowLevel    schedule 26.01.2015    source источник


Ответы (1)


Да, это возможно. Вы должны обработать событие RowValidating и выполнить свою логику, чтобы проверить, следует ли разрешить пользователю изменять строку. Если вы хотите отменить, используйте свойство eventArgs.Cancel и установите для него значение true.

Protected Overrides Sub OnRowValidating(e As DataGridViewCellCancelEventArgs)
If DialogResult.No = MessageBox.Show("Select a new record?", "New Record?", MessageBoxButtons.YesNo) Then
    e.Cancel = True
    Return
Else
    MyBase.OnRowValidating(e)
End If
End Sub
person Dan    schedule 26.01.2015
comment
Но все же есть еще одна проблема. Когда я щелкаю правой кнопкой мыши по ячейке (отличной от выбранной), она также выбирает ячейку. Итак, когда левый щелчок проходит через OnRowValidating, решение работает, но когда через него проходит правый щелчок, оно не работает или, может быть, не проходит. - person LowLevel; 26.01.2015
comment
Я заменил свой тестовый цикл на событие CellLeave. В событии OnRowValidation остается только e.Cancel. - person LowLevel; 26.01.2015