ComboBox SelectionChangeCommitted通过第一个键盘输入触发

时间:2014-05-22 20:11:01

标签: vb.net events combobox event-handling mouseevent

我有一个ComboBox。我的问题是当我点击元素1,然后开始键入元素2的名称时,我的元素2的第一个字母被添加。这只发生在点击事件后的按键上。


过程:

  1. 点击ComboBox
  2. 输入名称
  3. 点击元素名称 - 元素添加到我的网格
  4. 输入其他名称 - ISSUE - 与输入的第一个字母匹配的第一个元素将添加到网格中
  5. 单击并在单个选定元素上输入键可以正常工作。

    我的AutoCompleteMode设置为Append,AutoCompleteSource设置为ListItems


    我认为控制点击的解决方案在我的SelectionChangeComitted功能中。当我们知道鼠标单击组合框中的元素时,我可以控制标志isCLick仅设置为true。如果用户点击整个ComboBox,MouseClick将返回true,因此如果我们正在处理这个特定的ComboBox,它将始终为true。由于参数为EventArgs,我无法直接将其投放到MouseEventArgs,如果可以的话会很好。


    总结一下我的问题:我需要在isClick中替换SelectionChangeCommitted布尔值来验证SelectionChangeCommitted是否是由点击或{不。

    在这种情况下可以吗?是否有任何替代方案可以绕过这个问题?

    我有下面的事件处理程序代码,调用的顺序是:MouseClick - > PreviewKeyDown - > SelectionChangeCommitted - > SelectedValueChanged

    http://pastebin.com/9zWGHbWE

    AddHandler CType(ctl, ComboBox).PreviewKeyDown, Sub(sender As Object, e As PreviewKeyDownEventArgs)
                                                                    If e.KeyCode = Keys.Down OrElse e.KeyCode = Keys.Up OrElse e.KeyCode = Keys.Right OrElse e.KeyCode = Keys.Left Then
                                                                        e.IsInputKey = False
                                                                        AddToGrid = False
                                                                        isArrowKey = True
                                                                        isClick = False
                                                                    ElseIf e.KeyCode = Keys.Enter OrElse e.KeyCode = Keys.Tab Then
                                                                        AddToGrid = True
                                                                        isArrowKey = False
                                                                        isClick = False
                                                                        'Check if row already exists before insert a new one.
                                                                        If Not RowExists(DirectCast(ctl, Control).Tag, DirectCast(ctl, ComboBox).Text.ToUpper()) Then AppendGrid(sender)
    
                                                                    Else
                                                                        AddToGrid = False
                                                                        isArrowKey = False
                                                                        isClick = True
                                                                    End If
                                                                End Sub
    
                AddHandler CType(ctl, ComboBox).SelectedValueChanged, Sub(sender As Object, e As EventArgs)
                                                                          'MessageBox.Show("SelectionValueChanged")
                                                                          If CType(sender, ComboBox).SelectedValue Is Nothing Then Return
                                                                          If Not AddToGrid Then Return
    
                                                                          'Check if row already exists before insert a new one.
                                                                          If Not RowExists(DirectCast(ctl, Control).Tag, DirectCast(ctl, ComboBox).SelectedValue.ToString().ToUpper()) Then
                                                                              AppendGrid(sender)
                                                                          End If
                                                                      End Sub
    
                AddHandler CType(ctl, ComboBox).SelectionChangeCommitted, Sub(sender As Object, e As EventArgs)
                                                                              'MessageBox.Show("SelectionChangedCommitted")
    
    
                                                                              If CType(sender, ComboBox).SelectedValue Is Nothing Then Return
                                                                              If isArrowKey Then Return 'if an arrow was used, then don't add it to the grid
    
                                                                              If isClick Then
                                                                                  AddToGrid = True
                                                                              End If
    
                                                                              'Check if row already exists before insert a new one.
                                                                              If Not RowExists(DirectCast(ctl, Control).Tag, DirectCast(ctl, ComboBox).SelectedValue.ToString().ToUpper()) AndAlso AddToGrid Then
                                                                                  AppendGrid(sender)
    
                                                                              End If
    
    
                                                                          End Sub
    
                AddHandler CType(ctl, ComboBox).MouseClick, Sub(sender As Object, e As MouseEventArgs)
                                                                'MessageBox.Show("MouseClick")
                                                                isClick = True
                                                                AddToGrid = True
                                                            End Sub
    

1 个答案:

答案 0 :(得分:0)

除非执行点击,否则此处的所有内容似乎都能正常运行。我建议你在使用后重置点击。在SelectionChangeCommitted中尝试以下代码。

If isClick Then
    AddToGrid = True
    isClick = false
End If