我有一个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次以上的点击才能使值更改生效并触发组合处理程序事件。
我对如何解决这个问题感到很茫然。
答案 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这样简单的修改就解决了这个问题。