VB.NET中TextBox的智能感知应用实例
本文实例形式介绍了VB.NET中TextBox的智能感知实现方法,功能非常实用,具体如下:
该实例主要实现:在TextBox中键入字符,可以智能感知出列表,同时对不存在的单词(没有出现智能感知的)自动显示“NotFound”。
对此功能首先想到的是利用TextBox的AutoComplete功能。该功能允许你设置不同形式的AutoComplete智能感知,譬如:
1)AutoCompleteSource:设置感知源头类型(这里是CustomSource)。
2)AutoCompleteMode:设置感知的模式(输入不存在的字符追加,不追加还是同时存在,这里显然不追加)。
3)AutoCompleteCustomSource:设置源头数据(AutoCompleteSource必须是CustomSource)。
接下来思考如何在输入第一个字符的时候判断是否被感知到,如果没有则显示文本。
拖拽一个Label到窗体上,然后在TextBox的KeyUp事件中对数据源进行判断(为了方便,直接先把数据源数据转化成Array的形式然后使用扩展方法Any进行判断),同时为了防止界面卡死,使用异步。
具体实现代码如下:
PublicClassForm1
DimcollectionAsNewAutoCompleteStringCollection
PrivateReadOnlyarrayCollection()AsString={"a"}
PrivateSubForm1_Load(senderAsObject,eAsEventArgs)HandlesMyBase.Load
EndSub
PublicSubNew()
InitializeComponent()
collection.AddRange(NewString(){"apple","aero","banana"})
TextBox1.AutoCompleteCustomSource=collection
ReDimarrayCollection(collection.Count-1)
collection.CopyTo(arrayCollection,0)
EndSub
'''<summary>
'''Whenreleasethekeys,plzstartabackgroundthreadtohandletheproblem
'''</summary>
PrivateSubTextBox1_KeyUp(senderAsObject,eAsKeyEventArgs)HandlesTextBox1.KeyUp
DimactAsNewAction(Sub()
'Checkwhetherthereareanyvaluesinsidethecollectionornot
If(TextBox1.Text="")OrElse(arrayCollection.Any(Function(s)
Returns.StartsWith(TextBox1.Text)
EndFunction))Then
Label1.BeginInvoke(NewMethodInvoker(Sub()
Label1.Text=String.Empty
EndSub))
Else
Label1.BeginInvoke(NewMethodInvoker(Sub()
Label1.Text="Notfound"
EndSub))
EndIf
EndSub)
act.BeginInvoke(Nothing,Nothing)
EndSub
EndClass
这里有一些注意点:
1)异步的异常不会抛出(因为异步的本质是CLR内部的线程),只能调试时候看到。因此编写异步程序必须万分小心。
2)VB.NET定义数组(譬如定义String(5)的数组,其实长度是6(从0~5)包含“5”自身,因此数组复制(Redim重定义大小)的时候必须Count-1,否则重新定义的数组会多出一个来,默认是Nothing,这会导致异步线程出现异常)。