2015-01-26 1 views
0

Вот мой 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 &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 

ответ

0

Да, это возможно. Вы должны обрабатывать событие 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 
+0

Спасибо! Оно работает. – LowLevel

+0

Но все же есть еще одна проблема. Когда я щелкаю правой кнопкой мыши по ячейке (отличной от выбранной), она также выбирает ячейку. Таким образом, когда левый клик проходит через OnRowValidating, решение работает, но когда щелчок правой кнопкой мыши проходит через него, он не работает или, может быть, не проходит. – LowLevel

+0

Я заменил тестовый цикл на событие CellLeave. Только e.Cancel остается в событии OnRowValidation. – LowLevel