VB.NET ComboBox 实现自动完成、自动过滤 模糊查询的功能问题

rmini 2016-10-25 11:31:37
' 自动过滤函数
Private Sub AutoComplete(ByVal ComBox As ComboBox)
'With 函数的使用,不了解的可以上网查下
With ComBox
'首先清空自动完成自定义数据源,这样您可以在每次combobox的items项改变时,调用该函数
.AutoCompleteCustomSource.Clear()
'设置自动完成的完整字符串源,共有9种选项,这里选择了自定义源
.AutoCompleteSource = AutoCompleteSource.CustomSource
'设置组合框的文本完成行为,有四种选项,这里选择的是自动完成和列表框显示的组合
.AutoCompleteMode = AutoCompleteMode.SuggestAppend
'将items中所有的字符串添加到自定义数据源中
For Each item As String In .Items
.AutoCompleteCustomSource.Add(item)
Next
End With
End Sub

'这种方法是使用一个ComboBox 和ListBox的组合的方式实现,ComboBox命名为ComboBox1 ,ListBox是代码创建
' 在ComboBox1的TextChanged事件中执行操作如下
Private Sub ComboBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.TextChanged
'获取输入的字符串
Dim text As String = ComboBox1.Text.Trim()
'用以记录匹配字符串的个数
Dim index As Integer = 0
Dim listBox1 As New ListBox
' list_Pd是定义的全局布尔变量,用于判断是否创建了listbox控件
If list_Pd Then '如果已经创建
For Each contr As Control In Me.Controls '遍历窗体中的所有控件,寻找创建的listbox控件
If contr.Name = "list" Then
listBox1 = CType(contr, ListBox)
End If
Next
Else '如果没有创建,则调用Custom_ListBox()函数创建
listBox1 = Custom_ListBox(ComboBox1)
End If
'将listbox 控件所有项清空
listBox1.Items.Clear()
'将查询的结果添加到listbox 的items 中
For Each Str As String In ComboBox1.Items
'将所有的字符串全部转化为小写再判断,这样输入就不用分大小写了
If Not text = "" And Str.ToLower.Contains(text.ToLower) Then
index = index + 1
listBox1.Items.Add(Str)
End If
Next
'判断符合条件的项的个数,
If index = 1 Then
ComboBox1.Text = listBox1.Items(0)
ComboBox1.SelectionStart = Len(Me.ComboBox1.Text)
'ComboBox1.SelectedText = Trim(Me.ComboBox1.Text)
listBox1.Visible = False
ElseIf index > 1 Then
listBox1.Visible = True
Else
listBox1.Visible = False
End If
End Sub
'自动创建listbox控件的函数
Private Function Custom_ListBox(ByVal ComBox As ComboBox) As ListBox
Dim Listbox As New ListBox
Dim point As Point
point.X = ComBox.Location.X
point.Y = ComBox.Location.Y + ComBox.Height
With Listbox
.Name = "list" '设置控件名称
.Location = point '设置控件的位置,放在combobox的下面
.Width = ComBox.Width '控件的宽度,与combobox的宽一样
.Height = ComBox.Height * (ComBox.Items.Count + 1) '高度
.Items.Clear()
.Visible = False
End With
AddHandler Listbox.Click, AddressOf ListBox_Click '添加点击事件 ListBox_Click()
Me.Controls.Add(Listbox) '这步重要 将控件添加到窗体中。没有这句将不会显示listbox控件
list_Pd = True
Return Listbox
End Function
'创建的listbox的点击事件函数
Private Sub ListBox_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
CType(sender, ListBox).Visible = False
ComboBox1.Text = CType(sender, ListBox).SelectedItem
End Sub



以上是从网上百度得到的,但是有两个问题:
1是假设数据库中有“北京市朝阳区”,当我输入朝阳区的时候(即输入超过2个字),combobox自动显示为 北京市朝阳区阳区,这显然不是想要的,该怎么修改?
2是假设数据库中有“北京市朝阳区”,当我输入朝的时候(即输入只有1个字),combobox自动显示为 北京市朝阳区,这下是对的,但是此时没法用backspace键删除,我想可以用backspace键删除,该怎么修改?
3是当combobox得到正确的项后,怎么让combobox的字符设置为全部选中状态,应该修改哪里?
(以上环境是vs2010 vb.net)
...全文
1432 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiomer 2016-12-05
  • 打赏
  • 举报
回复
我自己弄了个自定义的combobox,就是实现类似这种模糊查询筛选结果功能,需要的话可以加我QQ314694902
rmini 2016-10-29
  • 打赏
  • 举报
回复
哪位前辈帮帮忙吧,我实在是不知道该怎么弄
rmini 2016-10-26
  • 打赏
  • 举报
回复
不太明白,应该怎么修改呢?
threenewbee 2016-10-25
  • 打赏
  • 举报
回复
AutoCompleteCustomSource.Add(item) 这个不是出现在下拉的条目,而是出现在下拉的候选条目,下拉的条目是系统自动匹配的

16,721

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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