VB.NET中TextBox的智能感知应用实例
程序员文章站
2024-02-19 22:12:52
本文实例形式介绍了vb.net中textbox的智能感知实现方法,功能非常实用,具体如下:
该实例主要实现:在textbox中键入字符,可以智能感知出列表,同时对不存在的...
本文实例形式介绍了vb.net中textbox的智能感知实现方法,功能非常实用,具体如下:
该实例主要实现:在textbox中键入字符,可以智能感知出列表,同时对不存在的单词(没有出现智能感知的)自动显示“not found”。
对此功能首先想到的是利用textbox的autocomplete功能。该功能允许你设置不同形式的autocomplete智能感知,譬如:
1)autocompletesource:设置感知源头类型(这里是customsource)。
2)autocompletemode:设置感知的模式(输入不存在的字符追加,不追加还是同时存在,这里显然不追加)。
3)autocompletecustomsource:设置源头数据(autocompletesource必须是customsource)。
接下来思考如何在输入第一个字符的时候判断是否被感知到,如果没有则显示文本。
拖拽一个label到窗体上,然后在textbox的keyup事件中对数据源进行判断(为了方便,直接先把数据源数据转化成array的形式然后使用扩展方法any进行判断),同时为了防止界面卡死,使用异步。
具体实现代码如下:
public class form1 dim collection as new autocompletestringcollection private readonly arraycollection() as string = {"a"} private sub form1_load(sender as object, e as eventargs) handles mybase.load end sub public sub new() initializecomponent() collection.addrange(new string() {"apple", "aero", "banana"}) textbox1.autocompletecustomsource = collection redim arraycollection(collection.count - 1) collection.copyto(arraycollection, 0) end sub ''' <summary> ''' when release the keys, plz start a background thread to handle the problem ''' </summary> private sub textbox1_keyup(sender as object, e as keyeventargs) handles textbox1.keyup dim act as new action(sub() 'check whether there are any values inside the collection or not if (textbox1.text = "") orelse (arraycollection.any(function(s) return s.startswith(textbox1.text) end function)) then label1.begininvoke(new methodinvoker(sub() label1.text = string.empty end sub)) else label1.begininvoke(new methodinvoker(sub() label1.text = "not found" end sub)) end if end sub) act.begininvoke(nothing, nothing) end sub end class
这里有一些注意点:
1)异步的异常不会抛出(因为异步的本质是clr内部的线程),只能调试时候看到。因此编写异步程序必须万分小心。
2)vb.net定义数组(譬如定义string(5)的数组,其实长度是6(从0~5)包含“5”自身,因此数组复制(redim重定义大小)的时候必须count-1,否则重新定义的数组会多出一个来,默认是nothing,这会导致异步线程出现异常)。