欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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,这会导致异步线程出现异常)。