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