2014-04-23 38 views
0

我有一個datagridview有一個包含兩個值的combox列。當一行的combobox值已被更改時,我正在使用更改更新後端數據庫。Datagridview組合框沒有選擇點擊/編輯

核心問題是數據只在您點擊下拉箭頭後纔會發生變化,然後選擇記錄。如果您單擊組合框單元格並選擇該值,它將不會執行任何操作,因爲組合框選定項目爲空。

有什麼讓我感到困惑的是,在Visual Studio中,除了最初的單擊之後它能夠正常工作,而且它的工作正常,但是當應用程序直接運行時,組合框運行緩慢,需要2到4次組合框才能真正檢測價值已經改變。

這是editcontrol處理程序。

Private Sub DataGridView_Changer(sender As Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) _ 
    Handles DataGridView.EditingControlShowing 
    Try 
     Dim Combo As ComboBox = CType(e.Control, ComboBox) 
     If Not IsNothing(Combo.SelectedItem) Then 
      RemoveHandler Combo.SelectedIndexChanged, New EventHandler(AddressOf ComboHandler) 
      AddHandler Combo.SelectedIndexChanged, New EventHandler(AddressOf ComboHandler) 
     End If 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
End Sub 

這是數據發生變化,並更新數據庫的組合框處理

Private Sub ComboHandler(sender As Object, e As EventArgs) 
      Try 
       Dim EmailID As Integer = DataGridView.CurrentRow.Cells("EmailID").Value 
       Dim Sent As Boolean = DataGridView.CurrentRow.Cells("BeenSent").Value 
       If Sent = True Then 
        Exit Sub 
       End If 
       Dim EMRec As DBClass.EmailRecordDB = EmailArchive.Where(Function(X) X.EmailID = EmailID).FirstOrDefault 
       Dim Combo As ComboBox = CType(sender, ComboBox) 
       If Combo.SelectedItem.ToString = "Failed" Then 
        EMRec.SentAttempt = 999 
        EMRec.BeenSent = False 
       ElseIf Combo.SelectedItem.ToString = "Resend" Then 
        EMRec.SentAttempt = 0 
        EMRec.BeenSent = False 
       End If 
       EMRec.ResetStatus() 'DB Update 
       DirtyCell() 
       Exit Sub 
      Catch ex As Exception 
       MsgBox(ex.Message) 
      End Try 
     End Sub 
Sub DirtyCell() 'Handles DataGridView.CurrentCellDirtyStateChanged 
    If DataGridView.IsCurrentCellDirty Then 
     Try 
      DataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit) 
        ContextualSearch() ' Refresh Grid 
     Catch ex As Exception 
      MsgBox(ex.Message) 
     End Try 

    End If 
End Sub 

UPDATE 24/04/2014

我已經調整了DirtyCell(),除去if語句,所以它提交更改,而不管該單元格是否髒。這似乎有所改善。

Sub DirtyCell() 'Handles DataGridView.CurrentCellDirtyStateChanged 
      Try 
       DataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit) 
         ContextualSearch() ' Refresh Grid 
      Catch ex As Exception 
       MsgBox(ex.Message) 
      End Try  
    End Sub 

UPDATE 25/04/2014

我還有具有ComboBox細胞最初被選擇的問題。它仍然需要3次點擊才能使值更改實際生效並觸發combohandler事件。

我不知道如何解決這個問題。

回答

0

而不是在編輯事件發生時捕獲並嘗試進行更新(事後) 我使用了CellValueChanged事件。

Combobox字段包含2個值,但默認情況下單元格的值爲空。

當CellValueChanged被觸發時,它的單元格的值已被更新。

我已將CurrentCellDirtyStateChanged添加到DirtyCell以自動提交數據更改並重新運行查詢。

像使用CellvalueChanged這樣簡單的修改就解決了這個問題。

1

確定這裏是我的想法。 selectedIndexChanged在很多情況下都不能正常工作,比如你的和我的。我更喜歡SelectionChangeCommited。另一個問題是你的AddHandler和removeHandler。您應該將選定的組合存儲在全局可變數據庫中,然後在開始編輯下一個組合時刪除事件處理程序。請參閱下面的建議代碼。它是在這裏工作我:)

編輯象下面這樣DataGridView_Changer:

Private lastCombo As ComboBox ''global variable to remember last combo with eventHandler i 
Private Sub DataGridView_Changer(sender As Object, e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) _ 
Handles DataGridView.EditingControlShowing 
Try 
    Dim Combo As ComboBox = CType(e.Control, ComboBox) 
    If Not IsNothing(Combo.SelectedItem) Then 
     If Not IsNothing(lastCombo) Then 
       RemoveHandler lastCombo.SelectionChangeCommitted, New EventHandler(AddressOf ComboHandler) 
     End If 
     lastCombo = Combo 
     AddHandler lastCombo.SelectionChangeCommitted, New EventHandler(AddressOf ComboHandler) 
    End If 
Catch ex As Exception 
    MsgBox(ex.Message) 
End Try 
End Sub 

好運!

+0

謝謝,我實際上只是嘗試使用CellValueChanged事件來執行值更新,並將處理程序恢復到DirtyCell。它似乎更可靠。 – DavidFletcher

+0

我期待我的答案被選中,但我很高興你通過。我希望你分享這些代碼。我最近做了一個項目,在列表框中使用組合框,因爲它按我想要的方式工作,對組合框更改操作!該單元比組合本身晚更新。 _regards – Ranhot

+0

我在等我的老闆確認它能夠滿足他的要求,然後我會把它貼出來。 – DavidFletcher