none
Visual Studio 2008中VB的ComboBox控件的一个Bug RRS feed

  • 问题

  •  

    新建一个ComboBox控件,

    在其属性Items里添加以下4行内容:

    1.借
    2.贷
    3.一借一贷
    4.多借多贷

    AutoCompleteSource设为Listitems,

    AutoCompleteMode设为Append,

    运行时若使用鼠标滚轮,可以滚动选择下拉列表中的项目,但是如果先用键盘输入其中一项的开头,则无法再用鼠标滚轮或上下键选择其它列表项。

     

    例如输入"3",这里ComboBox控件显示“3.一借一贷”,此时无法再用鼠标滚轮或上下键选择下拉列表项中的其它3项,只有用鼠标左键点选下拉列表,而且之后只要再选中该项(“3.一借一贷”),同样会再卡在该项。

    这个应该是一个Bug吧?请鉴定一下,谢谢

     

    2008年9月1日 14:17

答案

  • Code Snippet

    Dim intSelIndex As Integer
        Private Sub ComboBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged
            Dim i As Integer
            For i = 0 To ComboBox1.Items.Count - 1
                If ComboBox1.Text = ComboBox1.Items(i).ToString() Then
                    intSelIndex = i
                    Exit Sub
                End If
            Next
        End Sub

        Private Sub ComboBox1_DropDownClosed(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.DropDownClosed
            If ComboBox1.SelectedIndex < 0 Then
                ComboBox1.SelectedIndex = intSelIndex
                ComboBox1.Text = ComboBox1.SelectedItem.ToString()
            End If
        End Sub

     

     

    2008年9月4日 4:47
    版主

全部回复

  • 我觉得这不算一个bug

     

    ComboBox实际由Textbox+listbox组成,你输入是在textbox,不可能用滚轮

     

    如果要实现这个功能,你只有自己写代码

    2008年9月2日 2:04
    版主
  •  feiyun0112 写:

    我觉得这不算一个bug

     

    ComboBox实际由Textbox+listbox组成,你输入是在textbox,不可能用滚轮

     

    如果要实现这个功能,你只有自己写代码

     

    但是在这个例子里,通过文本的自动完成功能,ComboBox补充完整了选项,作为用户可以理解为这时候选中了其中一项,倘若这一项不是自己要的,自然就想到用鼠标或方向键滚动选项。但是这时候ComboBox实际上既还没有改变SelectIndex值,也因为输入了部分字符而导致不能用滚动方式选择列表项目。这样一来可以说Textbox+listbox的功能实际结合的不是很好。

     

    举一个例子,这是我曾经遇到的一个问题:

     

    打算实现这样的效果:在光标进入ComboBox时,自动弹出下拉列表,这时直接输入下拉列表项开头(同样通过AutoComplete填充完整),回车确认,然后让光标跳到下一个控件。

     

    我的做法是,使用Enter事件,设置ComboBox.DroppedDown为True,使用KeyDown事件和SendKey,在按下Enter时发送Tab键,让光标跳到下一个控件。

     

    但是结果是:在“选定”一项之后,回车,却发现ComboBox的Text又变成空字符串,ComboBox没有改变选项,也没有触发SelectIndexChange事件,没有达到预期效果。

     

    貌似这时候只有用鼠标去选下拉列表项目才有效,键盘输入的就不行,我一时也想不出什么法子,恳请指点,谢谢:)

     

     

    (这里还有一个小小的问题,如果要把KeyDown时截获的按键改成别的按键如何实现?我试过e.SuppressKeyPress = True,然后用SendKey,但是对于组合键似乎不行,例如按下“+”但要实现"Shift+Tab"效果,虽然能起作用,但原来的Key值还是反映到TextBox中了,TextBox.Text="+")

    Code Snippet

    Private Sub Text_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox3.KeyDown

                Dim AllowNumbers As Boolean = (e.KeyCode < Keys.D0 Or e.KeyCode > Keys.D9) And (e.KeyValue < Keys.NumPad0 Or e.KeyValue > Keys.NumPad9)
                Dim AllowOperationKeys As Boolean = (e.KeyCode < Keys.Left Or e.KeyCode > Keys.Down) And (e.KeyCode <> Keys.Insert And e.KeyCode <> Keys.Back And e.KeyCode <> Keys.Delete And e.KeyCode <> Keys.Home And e.KeyCode <> Keys.End And e.KeyCode <> Keys.Enter)

           If AllowNumbers And AllowOperationKeys Then e.SuppressKeyPress = True

                '按+相当于Shift+Tab,按Enter/Return相当于Tab,按*相当于选中全部内容,按/相当于删除
                If e.KeyCode = Keys.Add Then
                    SendKeys.Send("+{TAB}")'这里+号仍会出现在文本框中,Why?
                ElseIf e.KeyCode = Keys.Enter Then
                    SendKeys.Send("{TAB}")
                ElseIf e.KeyCode = Keys.Multiply Then
                    sender.SelectionStart = 0 : sender.SelectionLength = sender.Text.ToString.Length
                ElseIf e.KeyCode = Keys.Divide Then
                    sender.Text = ""
                End If

       End Sub

     

     

    2008年9月3日 14:24
  • Code Snippet

    Dim intSelIndex As Integer
        Private Sub ComboBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged
            Dim i As Integer
            For i = 0 To ComboBox1.Items.Count - 1
                If ComboBox1.Text = ComboBox1.Items(i).ToString() Then
                    intSelIndex = i
                    Exit Sub
                End If
            Next
        End Sub

        Private Sub ComboBox1_DropDownClosed(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.DropDownClosed
            If ComboBox1.SelectedIndex < 0 Then
                ComboBox1.SelectedIndex = intSelIndex
                ComboBox1.Text = ComboBox1.SelectedItem.ToString()
            End If
        End Sub

     

     

    2008年9月4日 4:47
    版主