Datagridview组合框未在单击/编辑时选择

Posted

技术标签:

【中文标题】Datagridview组合框未在单击/编辑时选择【英文标题】:Datagridview comboBox not selecting on click/edit 【发布时间】:2014-04-23 13:11:57 【问题描述】:

我有一个 datagridview,它有一个包含两个值的组合框列。当一行的组合框值发生更改时,我将使用更改更新后端数据库。

核心问题是数据只有在点击下拉箭头并选择记录后才会发生变化。如果您单击组合框单元格本身并选择该值,它不会执行任何操作,因为组合框选定的项目是空的。

让我感到困惑的是,除了在此之后的初始单击之外,它在 Visual Studio 中正常工作,但是当应用程序直接运行时,组合框运行缓慢,需要单击组合框 2 到 4 次才能实际检测到值已更改。

这是编辑控件处理程序。

 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

2014 年 4 月 24 日更新

我调整了 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

2014 年 4 月 25 日更新

我仍然遇到最初选择组合框单元格的问题。它仍然需要单击 3 次以上才能使值更改真正生效并触发组合处理程序事件。

我不知道如何解决这个问题。

【问题讨论】:

【参考方案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

祝你好运!!!

【讨论】:

谢谢,我实际上只是尝试使用 CellValueChanged 事件来进行值更新,并将处理程序恢复到 DirtyCell。这似乎要可靠得多。 我期待我的答案被选中,但我很高兴你能通过。我希望你分享代码。我最近做了一个项目,它在列表框中使用组合,因为它以我想要的方式工作,对组合框更改采取行动!。单元格比组合本身更晚更新。 _问候 我正在等待我的老板确认它是否让他满意,然后我会发布它。【参考方案2】:

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

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

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

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

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

【讨论】:

以上是关于Datagridview组合框未在单击/编辑时选择的主要内容,如果未能解决你的问题,请参考以下文章

Ajax AutoCompleteExtender文本框未在边缘浏览器中触发文本更改事件

以编程方式选择索引 0(从-1)时,组合框未触发 SelectedIndexChanged

单击组合框值时 DataGridView 列标题更改

保存的数据框未在 sql server 中正确显示

WinForms:DataGridView - 当单元格被编辑时显示组合框

强制商店仅加载未在 Multiselect 组合选择-EXTJS 中选择的值