ComboBox控件可以输入文本也可以提供列表来选择项,而且还自带有属性来实现自动匹配,但是它有一个弊端,只能从头开始匹配,例如"张三丰",只能输入“张”、"张三"或“张三丰”才能匹配出来,而输入"三"或“三丰”是匹配不了。演示代码如下:
Dim data() As String = {"张三丰|ZSF", "李四|LS", "王五|WW", "赵六|ZL", "田七|TQ"}
With Me.ComboBox1
.Items.AddRange(data)
.AutoCompleteMode = AutoCompleteMode.SuggestAppend
.AutoCompleteSource = AutoCompleteSource.ListItems
End With
效果如图:
而在项目想实现类似百度搜索框,输入文本时能够自动匹配,重要的是实现模糊匹配,也就是说在前台输入"三"或“三丰”也是有匹配项的。实现效果如图:
于是就开始百度,在优快云里查到《自动完成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