vb 关于combobox的问题

libain 2010-01-11 11:39:55
我想在VB的FORM中实现 百度 那样的功能 即 输入关键字后自动将相关信息 显示在下拉列表里
我已经写好了一部分 实现了 输入关键字自动从数据库中找到相关信息 但是还有两个问题没有解决 请大家帮吗
先将我写的程序 贴给大家看


Private Sub Combo1_Change()

Dim Count As Integer
Dim KeyCount As Integer
Dim tmpArray() As String
Dim SQL As String

’用来清空上次的检索结果(清空下来列表的数据)可惜每次到一半的时候就报错
' 报错内容是
If Combo1.ListCount > 0 Then
For i = 0 To Combo1.ListCount - 1
Combo1.RemoveItem (i)
Next i
End If

'获取DB连接
Call ModDB.getDBCon(Con)

SQL = "select ID from userInfo where ID like'" & Trim(Combo1.Text) & "%'"

'执行SQL
Call ModDB.getRecord(Rs, Con, SQL, flg)

'连接错误
If flg = 1 Then
GoTo Gendsub
End If

'其他错误
If flg >= 2 Then
Con.Close
GoTo Gendsub
End If

'DB检索件数
Count = Rs.RecordCount

'检索的字段数
KeyCount = 1

'取得检索结果 放在二维数组tmpArray()中
Call ModDB.setDataByKey(Rs, Count, KeyCount, tmpArray())

For i = 0 To Count - 1
Combo1.AddItem tmpArray(i, 0), i
Next i


'Combo1.AddItem "aaaa"
'Combo1.AddItem "aaaa"
'Combo1.AddItem "aaaa"
Con.Close
Gendsub:
End Sub
...全文
270 15 打赏 收藏 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
stayor 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用楼主 libain 的回复:]
If Combo1.ListCount > 0 Then
For i = 0 To Combo1.ListCount - 1
Combo1.RemoveItem (i)
Next i
End If
[/Quote]

If Combo1.ListCount > 0 Then
For i = 0 To Combo1.ListCount - 1
Combo1.RemoveItem (0)
Next i
End If
king06 2010-01-11
  • 打赏
  • 举报
回复
For i = Combo1.ListCount - 1 To 0 step -1
Combo1.RemoveItem (i)
Next i
king06 2010-01-11
  • 打赏
  • 举报
回复
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Sub Combo1_Change()
Dim str1 As String
str1 = Combo1.Text
'……
If Len(Combo1) > 0 Then SendMessage Combo1.hwnd, &H14F, True, 0
Combo1.Text = str1
Combo1.SelStart = Len(Combo1.Text)
End Sub
Private Sub Combo1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyBack Or KeyCode = vbKeyDelete Then
SendMessage Combo1.hwnd, &H14F, False, 0
End If
End Sub
libain 2010-01-11
  • 打赏
  • 举报
回复
还是有 问题

我不能输入多个字符
比如我输入一个 t 应该 ttt1 ttt2 ttt3 t2tt 出来
然后继续输入2的时候 应该是就有t2tt出来
现在根本不让我输入第二个字符

不想百度一样可以连续输入 实时显示
king06 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 libain 的回复:]
输入b的时候还有ttt1,那是你没清掉它,这个问题你得自己处理一下,比较简单的 

这个也不知道 怎么弄

一起写给我看看吧

一紧张就什么都不知道了
[/Quote]
If Len(Combo1) > 0 Then SendMessage Combo1.hwnd, &H14F, True, 0或sendkeys "{F4}"
Combo1_Change()的最后......头大
libain 2010-01-11
  • 打赏
  • 举报
回复
输入b的时候还有ttt1,那是你没清掉它,这个问题你得自己处理一下,比较简单的

这个也不知道 怎么弄

一起写给我看看吧

一紧张就什么都不知道了
libain 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 king06 的回复:]
引用 8 楼 libain 的回复:

VB codePrivate DeclareFunction SendMessage Lib"user32" Alias"SendMessageA" (ByVal hwndAsLong, ByVal wMsgAsLong, ByVal wParamAsLong, lParamAs Any)AsLongPrivateSub Combo1_Change()IfLen(Combo1)>0Then SendMessage Combo1.hwnd,&H14F,True,0End SubPrivateSub Combo1_KeyDown(KeyCodeAsInteger, ShiftAsInteger)If KeyCode= vbKeyBackOr KeyCode= vbKeyDeleteThen
SendMessage Combo1.hwnd,&H14F,False,0EndIfEnd Sub

输入b的时候还有ttt1,那是你没清掉它,这个问题你得自己处理一下,比较简单的
[/Quote]

能不能把我原来的在Combo1_Change()的代码也加进入啊
我看的有点晕
谢谢
king06 2010-01-11
  • 打赏
  • 举报
回复
发现F10也可以关闭下拉框,你用那个也可以
king06 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 libain 的回复:]
sendkeys "{F4}" 是可以显示了
可是 第一次 我在 输入框中 输入 tt 下拉列表中 会出现 相应的内容 ttt1 ttt2 ttt3
让后我把输入框的内容给删掉 这个时候应该没有显示下拉列表 可惜 实际上那个下来框还是在的
然后我在 输入 b 显示的下来列表时 bbb1 bbb2 可是 原来的 ttt1 ttt2 ttt3 还在

[/Quote]
还挺顽强的哈...
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Sub Combo1_Change()
If Len(Combo1) > 0 Then SendMessage Combo1.hwnd, &H14F, True, 0
End Sub
Private Sub Combo1_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyBack Or KeyCode = vbKeyDelete Then
SendMessage Combo1.hwnd, &H14F, False, 0
End If
End Sub


输入b的时候还有ttt1,那是你没清掉它,这个问题你得自己处理一下,比较简单的
libain 2010-01-11
  • 打赏
  • 举报
回复
sendkeys "{F4}" 是可以显示了
可是 第一次 我在 输入框中 输入 tt 下拉列表中 会出现 相应的内容 ttt1 ttt2 ttt3
让后我把输入框的内容给删掉 这个时候应该没有显示下拉列表 可惜 实际上那个下来框还是在的
然后我在 输入 b 显示的下来列表时 bbb1 bbb2 可是 原来的 ttt1 ttt2 ttt3 还在
king06 2010-01-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 libain 的回复:]
Combo1.Clear 我用过的 在那个Combo1_Change事件里面 你要是一开始就clear的话 就用输入了
我试过了 连输入框的东西都 清空了 不对的


第二个问题是  当我在输入的同时 要显示出 下拉列表 其时数据已经在列表中了 只是怎样在 不点击边上按个三角按钮的情况下 让 下拉列表显示出来
[/Quote]
没事最好不要用循环,耗时
要是担心输入框清空了,大不了定义一个变量保存一下combo.text
clear之后,再给combo.text赋予这个值就是了
king06 2010-01-11
  • 打赏
  • 举报
回复
sendkeys "{F4}"
libain 2010-01-11
  • 打赏
  • 举报
回复
Combo1.Clear 我用过的 在那个Combo1_Change事件里面 你要是一开始就clear的话 就用输入了
我试过了 连输入框的东西都 清空了 不对的

第二个问题是 当我在输入的同时 要显示出 下拉列表 其时数据已经在列表中了 只是怎样在 不点击边上按个三角按钮的情况下 让 下拉列表显示出来
king06 2010-01-11
  • 打赏
  • 举报
回复
晕,你只是简单的清空,用得着循环吗,没仔细看,以为有它用呢
直接Combo1.Clear

至于第二个问题,你就选一个ID字段,用得着存在一个2维数组里面吗
直接用记录集加载就是了
libain 2010-01-11
  • 打赏
  • 举报
回复
第一个问题已经解决了
'清空上次的下拉列表数据
While Combo1.ListCount <> 0
Combo1.RemoveItem (0)
Wend
这样就可以了

第二问题 怎样动态的显示下拉列表

1,453

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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