我在连接到Access数据库表的VB.Net 2008中有一个DGV。 DGV不是只读的,但除了包含组合框的一列外,其中只有只读列。组合框允许用户选择该特定行的结果,然后该程序根据在组合框中选择的项目将预先计算的值复制到“利润”列中。然后用户点击保存按钮并更新数据库(目前通过XSD中的SQL方法)。EditingControlShowing事件触发多次
到目前为止还不够容易。
这是代码。
Private Sub DGUserBets_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DGUserBets.EditingControlShowing
Dim combo As ComboBox = CType(e.Control, ComboBox)
If (combo IsNot Nothing) Then
// Remove an existing event-handler, if present, to avoid
// adding multiple handlers when the editing control is reused.
RemoveHandler combo.SelectedIndexChanged, _
New EventHandler(AddressOf DGUBStake_SelectedIndexChanged)
// Add the event handler.
AddHandler combo.SelectedIndexChanged, _
New EventHandler(AddressOf DGUBStake_SelectedIndexChanged)
End If
End Sub
Private Sub DGUBStake_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim myStatus As ComboBox = CType(sender, ComboBox)
Dim row = DGUserBets.CurrentRow
Select Case myStatus.SelectedIndex
Case 0
row.Cells("DGUBProfit").Value = 0
// pending. no action
Case 1
row.Cells("DGUBProfit").Value = row.Cells("DGUBIfWin").Value
// win
Case 2
// loses
row.Cells("DGUBProfit").Value = row.Cells("DGUBIfLose").Value
Case 3
// void
row.Cells("DGUBProfit").Value = 0
End Select
End Sub
我的问题是,它似乎是,如果用户选择从ComboBox所期望的结果,但不敲回车,并简单地将鼠标到一个不同的组合框,再次选择不同行的结果,第一个事件处理程序不会断开连接,因此事件会多次触发。然后,这会导致各种默认MSGBOX错误,并提出了问题,当用户试图提交到DB /出口程序等等等等
什么我需要做的所有更改?我是否需要.EndEdit适当的地方强制行以保存更改?我应该在哪里调用?
谢谢。
嗯.. EditControlShowing代码来自MSDN。你认为我可能没有正确实施它吗? http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcomboboxitingitingcontrol.aspx – user57087 2009-02-24 17:28:41
当您使用AddHandler时,您不会将创建的EventHandler保存在任何地方。做到这一点,并在调用RemoveHandler时使用该引用。 – 2009-02-24 17:37:17
在另一方面:你不应该甚至需要使用新EvenHandler: RemoveHandler combo.SelectedIndexChanged,AddressOf DGUBStake_SelectedIndexChanged 的AddHandler combo.SelectedIndexChanged,AddressOf DGUBStake_SelectedIndexChanged 应该做的。 – 2009-02-24 17:46:58