Datagridview comboBox未选择单击/编辑

时间:2014-04-23 13:11:58

标签: vb.net winforms datagridview datagridviewcombobox

我有一个datagridview,它有一个包含两个值的combox列。当行的组合框值已经改变时,我用更改来更新后端数据库。

核心问题是,只有在点击下拉箭头后数据才会发生变化,并选择记录。如果你点击组合框单元本身并选择它没有做任何事情的值,因为组合框所选项目是空的。

令我困惑的是,这在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

更新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

更新25/04/2014

我最初选择的组合框细胞仍然存在问题。它仍然需要3次以上的点击才能使值更改生效并触发组合处理程序事件。

我对如何解决这个问题感到很茫然。

2 个答案:

答案 0 :(得分: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
祝你好运!!!

答案 1 :(得分:0)

而不是在编辑事件发生时捕获并尝试进行更新(后见之明) 我使用了CellValueChanged事件。

Combobox字段包含2个值,但默认情况下,单元格的值为空。

当CellValueChanged被触发时,它是在更新了单元格的值之后。

我已将CurrentCellDirtyStateChanged添加到DirtyCell以自动提交数据更改并重新运行查询。

使用CellvalueChanged这样简单的修改就解决了这个问题。