可不可以在COMBOBOX中输入一个字母,然后COMBOBOX.TEXT中显示相关数据信息,再输入更多字母后,显示范围缩小,结果更精确?响应COMBOBOX的CHANGE事件。但数据来源不是数据库,而是事先已经从数据库中加载入下拉框中数据。
例如:
     COMBOBOX从数据库中已加载am、abc、bike、baby、boy、box 等。当点击下拉框,可以选择在list中的这些数据。
     但是,也可以在TEXT框中录入数据,然后在list中快速查询,如,手工录入第一个字母b,在LIST中得到第一个以b开头数据bike,显示在TEXT框中,只是除第一个字母b外,其它字母ike加蓝条加亮。当焦点离开COMBOBOX时,TEXT框中,就完全显示bike,没有蓝条加亮。焦点没离开,则继续输入字母a,则在LIST中得到第一个以ba开头数据baby,显示在TEXT框中,只是除前两个字母ba外,其它字母by加蓝条加亮。当焦点离开COMBOBOX时,TEXT框中,就完全显示baby,没有蓝条加亮。其它类似。不知如何实现这个功能,最好有代码,谢谢。

解决方案 »

  1.   

    这叫AutoCompleteComboBox,外面的例子太多了。http://www.freevbcode.com/ShowCode.Asp?ID=4532
      

  2.   

    Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Public Sub ComboBoxChange(ByRef CB As ComboBox)
        Dim iStart As Integer
        Dim sString As String
          
        iStart = CB.SelStart
        If iStart = 0 Then
            Exit Sub
        End If
        
        sString = CStr(Left(CB.Text, iStart))
        CB.ListIndex = SendMessage(CB.hwnd, CB_FINDSTRING, 0, ByVal sString)    CB.SelStart = iStart
        CB.SelLength = Len(CB.Text) - iStart
    End Sub
      

  3.   

    '----------------------------------------------------------------------------
    '
    'Author:lihonggen0
    'Date:2003-6-19
    '功能:listbox 模糊查询
    '----------------------------------------------------------------------------Option Explicit'申明API函数
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As LongConst LB_FINDSTRING = &H18F '常数Private Sub Form_Load()    Text1 = "" '令文本框为空
        List1.AddItem "abc"
        List1.AddItem "bike"
        List1.AddItem "baby"
        List1.AddItem "boy"
        List1.AddItem "box"
    End Sub
    Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
        Dim intLong As Integer
        If KeyCode = vbKeyBack Then Exit Sub
      
        List1.ListIndex = SendMessage(List1.hwnd, LB_FINDSTRING, -1, ByVal CStr(Text1.Text))
        intLong = Len(Text1.Text)
        Text1.Text = List1.Text
        Text1.SelStart = intLong
        Text1.SelLength = Abs(Len(Text1.Text) - intLong)End Sub
      

  4.   

    '----------------------------------------------------------------------------
    '
    'Author:lihonggen0
    'Date:2003-6-19
    '功能: Combo 模糊查询
    '----------------------------------------------------------------------------
    '申明API函数
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As Long
    Private Const WM_SETREDRAW As Long = &HB&
    Private Const CB_FINDSTRING As Long = &H14C&
    Public Sub SearchCombo(InControl As Object)
        On Error GoTo trap
         
        Dim StrPos As Long
        Dim lPos As Long
        Dim SearchStr As String
         
         If TypeOf InControl Is ComboBox Then
         StrPos = InControl.SelStart
         SearchStr = Left$(InControl.Text, StrPos)
         
         lPos = SendMessage(InControl.hwnd, CB_FINDSTRING, 0, ByVal SearchStr)
         
         If lPos >= 0 Then
         InControl.Text = InControl.List(lPos)
         InControl.ListIndex = lPos
         End If
         
         With InControl
         .SelStart = StrPos
         .SelLength = Len(InControl.Text)
         End With
         End If
         Exit Sub
    trap:
         MsgBox Err.Description
        End Sub
         Private Sub Combo1_KeyUp(KeyCode As Integer, Shift As Integer)
        If KeyCode = vbKeyBack Then Exit Sub
        Call SearchCombo(Combo1)
    End SubPrivate Sub Form_Load()
        
        Combo1.AddItem "abc"
        Combo1.AddItem "baby"
        Combo1.AddItem "bike"
        Combo1.AddItem "boy"
        Combo1.AddItem "box"
    End Sub
      

  5.   


    '----------------------------------------------------------------------------
    '
    'Author:lihonggen0
    'Date:2003-6-19
    '功能:listbox 模糊查询
    '----------------------------------------------------------------------------Option Explicit'申明API函数
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As LongConst LB_FINDSTRING = &H18F '常数Private Sub Form_Load()    Text1 = "" '令文本框为空
        List1.AddItem "abc"
        List1.AddItem "bike"
        List1.AddItem "baby"
        List1.AddItem "boy"
        List1.AddItem "box"
    End Sub
    Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
        Dim intLong As Integer
        If KeyCode = vbKeyBack Then Exit Sub    List1.ListIndex = SendMessage(List1.hwnd, LB_FINDSTRING, -1, ByVal CStr(Text1.Text))
        intLong = Len(Text1.Text)
        Text1.Text = List1.Text
        Text1.SelStart = intLong
        Text1.SelLength = Abs(Len(Text1.Text) - intLong)End Sub
      

  6.   

    VB有一个Like的比较运算符如 if abc like "*c" = true then
          msgbox true
       end if里面的通配符和DOS里面的通配符是一回事通过这个,就可以实现模糊查询了