可不可以在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,没有蓝条加亮。其它类似。不知如何实现这个功能,最好有代码,谢谢。
例如:
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,没有蓝条加亮。其它类似。不知如何实现这个功能,最好有代码,谢谢。
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
'
'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
'
'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
'----------------------------------------------------------------------------
'
'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
msgbox true
end if里面的通配符和DOS里面的通配符是一回事通过这个,就可以实现模糊查询了