在组合框中输入前几位时出现相匹配的值添加到组合框的列表中

zhangyu2001_198 2010-08-05 04:13:46


如图,输入一位时,在下面的列表中可以添加相匹配的值,但组合框的文本区域没有刚输入的那一位,被清空了,导致根本没法输两位!谢谢
代码如下:
Private Sub Combo1_Change()
Dim khmc As String
khmc = Combo1.Text


Call rsOpen1("select distinct kh from dm_wz where kh like '" & khmc & "%' order by kh ")
If rs.RecordCount > 0 Then
Combo1.Clear

Do Until rs.EOF
Combo1.AddItem rs.Fields("kh")
rs.MoveNext
Loop
Else
Combo1.Clear
End If

End Sub
...全文
152 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyu2001_198 2010-08-06
  • 打赏
  • 举报
回复
我不是要在combo1中模糊查找,而是要根据combo1的文本区域所输入的值,到数据库表中查询,再将相匹配的前几位一样的,加入到combo1的下拉列表中,可以直接单击
Tiger_Zhao 2010-08-06
  • 打赏
  • 举报
回复
其实就是简单的如何防止消息重入的问题
Private Sub Combo1_Change()
Static bIsReEntry As Boolean
Dim khmc As String

If bIsReEntry Then Exit Sub
bIsReEntry = True

khmc = Combo1.Text

Call rsOpen1("select distinct kh from dm_wz where kh like '" & khmc & "%' order by kh ")
If rs.RecordCount > 0 Then
Combo1.Clear

Do Until rs.EOF
Combo1.AddItem rs.Fields("kh")
rs.MoveNext
Loop
Else
Combo1.Clear
End If

Combo1.Text = khmc '<-这里要还原文本'

bIsReEntry = False
End Sub
king06 2010-08-06
  • 打赏
  • 举报
回复
不能用clear方法
Private Sub Combo1_Change()
Dim khmc As String
khmc = Combo1.Text

Call rsOpen1("select distinct kh from dm_wz where kh like '" & khmc & "%' order by kh ")
If Rs.RecordCount > 0 Then
Dim i As Long
For i = 0 To Combo1.ListCount - 1
Combo1.RemoveItem 0
Next

Do Until Rs.EOF
Combo1.AddItem Rs.Fields("kh")
Rs.MoveNext
Loop
Else
Combo1.Clear
End If
End Sub
zhangyu2001_198 2010-08-06
  • 打赏
  • 举报
回复
我试了一下,感觉不对
zhangyu2001_198 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 of123 的回复:]
实际用法:

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWND As Long, _
ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long

Private Const CB_FI……
[/Quote]

可以根据我的需要,写一下吗?
of123 2010-08-05
  • 打赏
  • 举报
回复
实际用法:

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWND As Long, _
ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long

Private Const CB_FINDSTRING = &H14C '在 ComboBox 中模糊查找

Private Sub Combo1_KeyPress(KeyAscii As Integer)
Call ComboIncrementalSearch(Combo1, KeyAscii)
End Sub

Private Sub Form_Load()
Dim i As Long

For i = 0 To 9
Combo1.AddItem "12" & Right("00000" & Rnd() * 100000, 6)
Next i

End Sub

Public Sub ComboIncrementalSearch(cbo As ComboBox, KeyAscii As Integer)
Static dTimerLast As Double
Static sSearch As String
Static hWndLast As Long
Dim nRet As Long

Const MAX_KEYPRESS_TIME = 0.8

' Weed out characters that are not scanned
If (KeyAscii < 32 Or KeyAscii > 127) Then Exit Sub

If (Timer - dTimerLast) < MAX_KEYPRESS_TIME And hWndLast = cbo.hWND Then
sSearch = sSearch & Chr$(KeyAscii)
Else
sSearch = Chr$(KeyAscii)
hWndLast = cbo.hWND
End If

' Search the combo box
nRet = SendMessage(cbo.hWND, CB_FINDSTRING, -1, ByVal sSearch)
If nRet >= 0 Then
cbo.ListIndex = nRet
End If
KeyAscii = 0
dTimerLast = Timer
End Sub
zhangyu2001_198 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 of123 的回复:]
就是调用 SendMessage 做模糊查找。
[/Quote]


我要查找的数据在数据库的表中
khmc = Combo1.Text


Call rsOpen1("select distinct kh from dm_wz where kh like '" & khmc & "%' order by kh ")
zhangyu2001_198 2010-08-05
  • 打赏
  • 举报
回复
我的目的很简单,当在组合框中输入0时,在组合框的下拉列表中加载以“0”开头的所有项,然后可以直接单击,以输入09时,就加载以“09”开头的所有项,输入1时,就加载以“1”开头的所有项,目前的情况是,只能输入一位,像输入“0”或“9”,之后,下拉列表框中是加载了相应的项,但“0”或“9“在组合框的文本区域也被清空了,导致没法输两位
of123 2010-08-05
  • 打赏
  • 举报
回复
就是调用 SendMessage 做模糊查找。
zhangyu2001_198 2010-08-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 of123 的回复:]
如果没有汉字,用这个:

'组合框列表增量查找

Public Sub ComboIncrementalSearch(cbo As ComboBox, KeyAscii As Integer)
Static dTimerLast As Double
Static sSearch As String
Static hWndLast As Long
Dim nRet As Long
……
[/Quote]


没有汉字,。是衣服的款号,如“095006”、“159684”,都是六位,但你的方法看不懂
zhangyu2001_198 2010-08-05
  • 打赏
  • 举报
回复
以上两种方法不能理解,盼详解,谢谢!
打死不掉牙 2010-08-05
  • 打赏
  • 举报
回复
哦,对了,要在timer1_Timer里加上Timer1.Enabled = False,不然就无限查询下去了,忘记加了
of123 2010-08-05
  • 打赏
  • 举报
回复
如果没有汉字,用这个:

'组合框列表增量查找

Public Sub ComboIncrementalSearch(cbo As ComboBox, KeyAscii As Integer)
Static dTimerLast As Double
Static sSearch As String
Static hWndLast As Long
Dim nRet As Long
Const MAX_KEYPRESS_TIME = 0.5
' Weed out characters that are not scanned
If (KeyAscii < 32 Or KeyAscii > 127) _
Then Exit Sub
If (Timer - dTimerLast) < _
MAX_KEYPRESS_TIME And hWndLast = _
cbo.hWnd Then
sSearch = sSearch & Chr$(KeyAscii)
Else
sSearch = Chr$(KeyAscii)
hWndLast = cbo.hWnd
End If
' Search the combo box
nRet = SendMessage(cbo.hWnd, _
CB_FINDSTRING, -1, ByVal sSearch)
If nRet >= 0 Then
cbo.ListIndex = nRet
End If
KeyAscii = 0
dTimerLast = Timer
End Sub
打死不掉牙 2010-08-05
  • 打赏
  • 举报
回复
你就是在qq群里提问的那个吧,我贴上我的方法你看看,这个类似于做个输入超时处理,combo1.clear确实是清除combo的操作,但是不清除combo1.text里面就存在不完整的内容了,你要实现演示清除的话也可以用我下面贴的类似处理方法,在timer里运行combo1.clear

Private Sub Combo1_Change()
Timer1.Enabled = False
Timer1.Enabled = True
End Sub

Private Sub Form_Load()
Timer1.Interval = 500
Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
Dim khmc As String
khmc = Combo1.Text


Call rsOpen1("select distinct kh from dm_wz where kh like '" & khmc & "%' order by kh ")
If rs.RecordCount > 0 Then
Combo1.Clear

Do Until rs.EOF
Combo1.AddItem rs.Fields("kh")
rs.MoveNext
Loop
Else
Combo1.Clear
End If
End Sub
zhangyu2001_198 2010-08-05
  • 打赏
  • 举报
回复
If rs.RecordCount > 0 Then
Combo1.Clear
感觉是这里的问题,但不知如何改?

742

社区成员

发帖
与我相关
我的任务
社区描述
VB 版八卦、闲侃,联络感情地盘,禁广告帖、作业帖
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧