VB.NET学习笔记:WinForm扩展ComboBox控件——仿百度搜索框(输入文本智能模糊提示说明、自动匹配过滤)

ComboBox控件可以输入文本也可以提供列表来选择项,而且还自带有属性来实现自动匹配,但是它有一个弊端,只能从头开始匹配,例如"张三丰",只能输入“张”、"张三"或“张三丰”才能匹配出来,而输入"三"或“三丰”是匹配不了。演示代码如下:

Dim data() As String = {"张三丰|ZSF", "李四|LS", "王五|WW", "赵六|ZL", "田七|TQ"}
        With Me.ComboBox1
            .Items.AddRange(data)
            .AutoCompleteMode = AutoCompleteMode.SuggestAppend
            .AutoCompleteSource = AutoCompleteSource.ListItems
        End With

效果如图:
在这里插入图片描述
而在项目想实现类似百度搜索框,输入文本时能够自动匹配,重要的是实现模糊匹配,也就是说在前台输入"三"或“三丰”也是有匹配项的。实现效果如图:
在这里插入图片描述
于是就开始百度,在CSDN里查到《自动完成TextBox实现类似百度搜索框》一文,是通过扩展控件方法来实现的,改编了一下,用到ComboBox控件来。唉,不生产代码,只能做代码的搬运工啦,55……

Imports System.ComponentModel
Public Class ComboBoxEx
    Inherits ComboBox

#Region "字段"
    ''' <summary>
    ''' 列表框
    ''' </summary>
    Private listBox As ListBox
    ''' <summary>
    ''' 记住前输入的字符串
    ''' </summary>
    Private oldText As String
    ''' <summary>
    ''' 显示面板
    ''' </summary>
    Private panel As Panel
    ''' <summary>
    ''' 进程锁
    ''' </summary>
    Private _lockObj As Object = New Object()
#End Region

#Region "属性"
    ''' <summary>
    ''' 在显示之前键入的最小字符
    ''' </summary>
    ''' <returns></returns>
    <Category("筛选"), Description("在显示之前键入的最小字符"), DefaultValue(1)>
    Public Property MinTypedCharacters As Integer = 1

    ''' <summary>
    ''' listBox选择索引值
    ''' </summary>
    ''' <returns></returns>
    <Category("筛选"), Description("listBox选择索引值"), DefaultValue(0)>
    Public Property LstSelectedIndex As Integer
        Get
            Return listBox.SelectedIndex
        End Get
        Set(ByVal value As Integer)
            If listBox.Items.Count > 0 Then listBox.SelectedIndex = value
        End Set
    End Property

    ''' <summary>
    ''' 当前显示的实际列表
    ''' </summary>
    ''' <returns></returns>
    Private Property CurrentAutoCompleteList As List(Of String)

    ''' <summary>
    ''' 该控件的父窗体
    ''' </summary>
    ''' <returns></returns>
    Private ReadOnly Property ParentForm As Form
        Get
            Return Me.Parent.FindForm()
        End Get
    End Property
#End Region

#Region "构造函数"
    Public Sub New()
        '调用基类构造函数
        MyBase.New()

        '列表框
        Me.listBox = New ListBox()
        Me.listBox.Name = " SuggestionListBox"
        Me.listBox.Font = Me.Font
        Me.listBox.Visible = True

        '这个容器用来保持列表框所在位置
        Me.panel = New Panel()
        Me.panel.Visible = False
        Me.panel.Font = Me.Font
        '能够适应父窗体的大小更改
        Me.panel.AutoSizeMode = AutoSizeMode.GrowAndShrink
        '初始化最小尺寸以避免重叠或闪烁问题
        Me.panel.ClientSize = New Size(1, 1)
        Me.panel.Name = " SuggestionPanel"
        Me.panel.Padding = New Padding(0, 0, 0, 0)
        Me.panel.Margin = New Padding(0, 0, 0, 0)
        Me.panel.BackColor = Color.Transparent
        Me.panel.ForeColor = Color.Transparent
        Me.panel.Text = " "
        Me.panel.PerformLayout()
        '控件是否存在容器里
        If Not pa
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值