微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

章鱼哥出品_VB.NET ComboBox、 TextBox 实现自动完成、自动过滤 模糊查询的功能

本文以ComboBox为例讨论自动过滤功能,主要有两种方式:(TextBox也一样)

一、以AutoCompleteSource、AutoCompleteMode、AutoCompleteCustomSource这三个属性的设置来实现自动过滤。
但是这种方法只能从左到右的过滤,比如Items中有 12、13两项,输入1的时候就会出现12、13两项,但是输入2的时候就不会有任何显示。下面是这种方法的具体实现代码

' 自动过滤函数
    '章鱼哥 QQ 3107073263 群 309816713
    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

执行效果如图:

二、 模糊查询方式 看到网上有很多人问到如何做到模糊查询,就是输入字符串中的任意一个字符,就会显示全部符合条件的结果,如上面提到的12、13的例子,第一种方法就是实现不了输入2显示12的效果。这里笔者给出一种解决方法,具体实现如下:
 
'这种方法是使用一个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 += 1
                listBox1.Items.Add(Str)
            End If
        Next
        '判断符合条件的项的个数,
        If index = 1 Then
            ComboBox1.Text = listBox1.Items(0)
            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


 
 

代码执行效果如图:

原文地址:https://www.jb51.cc/vb/257776.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐