自动填充TextBox

   

介绍:

这是我的第一篇翻译文章,如有不当,欢迎指教。原文地址:

http://www.codeproject.com/KB/cs/AutoCompleteTextBox.aspx

 

在我工作当中的一个项目中我需要一个简单的自动填充TextBox,但是我在一大堆其它的方法中没有找到合适的。这些方法大部分都是继承自combobox,当你连续输入的时候,他的下拉列表不能连续的去掉一些条件。(翻译的不是很准确,原文:Many of them derive from a combo box which will not work properly for a dropdown list that continues to filter out items as you continue to type.)这是我的第一篇文章,所以欢迎探讨。

使用方法:

这个textbox的使用方法很简单,需加入一些AutoCompleteEntry 条件:

这些条件类集合继承于IAutoCompleteEntry接口,它允许你使用AutoCompleteTextBox达到各种目的。IAutoCompleteEntry接口提供一个string数组来匹配用户的输入。下拉列表显示出结果。

 

 

提示:我创建了一个控件,名叫CoolTextBox。在其中集成了AutoCompleteTextBox。他仅仅是为textbox实现了一个很酷的边框。我在demo中就是使用了CooltextBox
设计:
我决定使用textbox,通过按键事件来显示结果弹出框。下拉框中只显示匹配用户输入的项目。
问题:

实现的问题集中在没有一个简单的方法实现大家所期望的弹出框模式。要显示弹出框很简单,但是我们需要集中焦点在textbox,更新弹出框的数据,甚至在弹出框实现按键响应。还有当鼠标点击在弹出框外或者textbox外时,我们需要隐藏弹出框。(我知道这听起来似乎很简单)。

执行:

控制弹出:

我喜欢写一些一般化和与用户交互方便的控件。我喜欢我的autocomplete textbox在我输入两个字符,或者我按下Control+Space组合键的时候弹出我希望的列表。一些人或许有完全不同的想法,所以我决定使用AutoCompleteTrigger对象来控制下拉框的事件。

下面是默认属性的设置代码(那个带“Consume”的阻止更进一步的按键事件)。

  

关闭弹出框的情况:

在下面的任意情况下,下拉框都会关闭:

1、  用户点击任何一项时

2、  下面的任一情况触发时:

a)         TriggerState.Select

b)      TriggerState.SelectAndConsume

c)      TriggerState.Hide

d)      TriggerState.HideAndConsume

3、当用户点击不在弹出框和textbox范围的地方。

1和第2种情况相当的简单,我就不在这里废话了。如果有兴趣你可以下载源代码。第三种情况的实现确实是一个挑战。

处理鼠标点击:

这里有几个地方我们需要时刻抓住,以便可以计算出鼠标是否点击在textbox或者弹出框外。

我们需要捕获textboxOnLostFocus,和弹出框的Deactivate事件。

这些都是简单的。现在我们需要捕获所有的发生在我们的textbox所在的窗体,及其子控件的鼠标事件。这确实有点难度。为了实现它我使用了NativeWindow的基类来实现鼠标的挂钩。接下来我监听所有的鼠标事件。当鼠标单击在textbox范围内时,弹出框依然出现,如果不是,那么就隐藏弹出框。

结论:

当然这里还有很多的细节,比如如何把这些整合到一块。不过这些都是比较直观的。我觉得对于自动填充TextBox这是一个可行的解决方案。希望大家有兴趣。

源文件已上传到资源,http://download.csdn.net/source/2930345 Demo和源代码。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值