2017-05-02 51 views
0

我有一個帶複選框列的DGV,我想在用戶點擊複選框時觸發一個事件,觸發事件後系統會檢查複選框是否被選中,然後什麼都不做。問題是當我點擊複選框時,系統總是先改變複選框的狀態,然後才觸發下面的事件,如何使其觸發下面的事件,然後只改變複選框的狀態?爲了簡單起見,我想當用戶點擊複選框然後提示messagebox時,如果MsgBoxResult.Yes然後CheckBox.Checked = True並觸發下面的事件,如果MsgBoxResult.No則什麼也不做。DataGridViewCheckBoxColumn CellContentClick事件問題

我嘗試添加選擇的情況下消息框下面的代碼,但系統仍能先改變複選框狀態,則僅提示MessageBoxDialog

Private Sub dgv_supplier_CellContentClick(sender As System.Object, e As DataGridViewCellEventArgs) Handles dgv_supplier.CellContentClick 
     Dim senderGrid = DirectCast(sender, DataGridView) 

     If (e.ColumnIndex >= 0 And e.RowIndex >= 0) Then 
      If TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewCheckBoxColumn AndAlso e.RowIndex >= 0 Then 
       Dim index = e.RowIndex 
       Dim currRow = dgv_supplier.Rows(index) 
       Dim str_supName = currRow.Cells("sup_name").Value 

       If currRow.Cells("checkbox").Value = True Then 
        Exit Sub 
       Else 
        'Do something 
       End If 
      End If 
     End If 
    End Sub 

回答

1

使用DataGridView.CurrentCellDirtyStateChanged Event,電池的實際值發生改變之前,這提高。

Private Sub dgv_supplier_CurrentCellDirtyStateChanged(
    sender As Object, 
    e As EventArgs) Handles dgv_supplier.CurrentCellDirtyStateChanged 

    Dim senderGrid = DirectCast(sender, DataGridView) 
    Dim cell = senderGrid.CurrentCell 

    If cell.ColumnIndex < 0 Then Exit Sub 
    If cell.RowIndex < 0 Then Exit Sub 

    Dim checkBoxCell = TryCast(senderGrid.CurrentCell, DataGridViewCheckBoxColum) 
    If checkBoxCell Is Nothing Then Exit Sub 

    Dim currentRow = cell.OwningRow 
    Dim str_supName = currentRow.Cells("sup_name").Value 

    ' currentCell.Value is previous value before click 
    If currentCell.Value = True Then 
     ' commit changes 
     senderGrid.CommitEdit(DataGridViewDataErrorContexts.Commit) 
    Else 
     ' Do something 
    End If 
End Sub