ASP.NET: Custom AutoCompleteTextBox WebControl [With Source Code]

这是一个Teddy最近封装的AutoCompleteTextBox。我们知道,ASP.NET本身的TextBox也是支持一定的AutoComplete功能的,但是那是依赖浏览器实现的,并不能指定自定义的AutoComplete候选项。本文列举的AutoCompleteTextBox则弥补了这个缺憾。只需设置AutoCompleteTextBox.AutoCompleteData属性,传递一个string[],就能使TextBox支持自定义候选项了。

AutoComplete逻辑

如果没有匹配当前输入的候选项,则同一般的TextBox;
如果只有一个候选项与当前输入匹配,则自动完成;
如果有超过一个候选项与当前输入匹配,则在textbox中自动完成第一个候选项,并弹出包含所有候选项的弹出框。

实现源码

源码是在VS2005编译的,不过实际上几乎没有使用依赖2.0的语法,在vs2003下经极少修改就同样能编译的。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace Ilungasoft.Framework.Web.UI.WebControls
{
    [ToolboxData(
"<{0}:AutoCompleteTextBox runat=server></{0}:AutoCompleteTextBox>")]
    
public class AutoCompleteTextBox : WebControl
    
{
        
Private Members

        
Properties

        
Overriden Members
    }

}

下载

下载源码及可直接引用的dll

0
0
(请您对文章做出评价)
« 上一篇:自定义通用System.Web.UI.IHierarchicalDataSource简单实现
» 下一篇:ASP.Net 2.0 - 使用Ilungasoft Framework加速Web开发
posted @ 2006-02-27 16:26 Teddy's Knowledge Base 阅读(3516) 评论(14)  编辑 收藏 网摘 所属分类: Web Dev.

  回复  引用  查看    
#1楼2006-02-27 17:08 | alittlefish      
不错!
不过干嘛加个ASP.NET 2.0的前缀,除了注册脚本以及多了textbox多设置了个新属性,其他的和1.x基本没什么两样哦。
不过还是收藏了!

  回复  引用  查看    
#2楼[楼主]2006-02-27 17:12 | Teddy's Knowledge Base      
@alittlefish

去掉2.0这几个字了:)

  回复  引用  查看    
#3楼2006-02-27 17:25 | alittlefish      
对了,我看你getValue用的是Request.Form(...),好象有点别扭。为什么不让控件实现IPostBackDataHandler。textbox的id用个Helper构造,然后getValue就用IPostBackDataHandler.LoadPostData直接取。

还有,ToJsStringArray这个方法的实现应该可以用Page.RegisterArrayDeclaration来做,那样更方便吧:)

  回复  引用  查看    
#4楼[楼主]2006-02-27 17:36 | Teddy's Knowledge Base      
@alittlefish

谢谢你的建议。

自己写ToJsStringArray是因为RegisterArrayDeclaration不支持string[]作参数,而ToJsStringArray本身也是我的另一个函数库中的一部分,所以随手就用了。

而IPostBackDataHandler我在调试的时候总是不触发,所以后来就没实现它,算是有点偷懒。

不过话说回来了,仅仅是一个text,request.form来获取似乎也够了,毕竟是封装起来的,不需用户这么写代码。

  回复  引用  查看    
#5楼2006-02-27 17:38 | alittlefish      
呵呵,只要实现了效果就ok!我只是给你挑挑刺,哈哈:)
  回复  引用  查看    
#6楼2006-02-27 20:39 | 高海东      
不错
  回复  引用  查看    
#7楼2006-03-07 17:00 | 辉狼      
我试了一下,好像不能够实现汉字的自动提示
  回复  引用  查看    
#8楼[楼主]2006-03-07 17:42 | Teddy's Knowledge Base      
@辉狼

因为绝大多数中文输入法比如微软拼音会在操作系统级别拦截键盘事件,因此,浏览器很难像印文字母那样准确捕捉中文输入,所以对中文自动完成的实现就不那么容易了。

你可以试试给一个input type=text标签设置onchange事件,你会惊奇的发现,当你用中文输入法比如比如微软拼音2003输入一个汉字后,onchange时间是不会被激发的。对于IE,当焦点离开input时会触发这个onchange,而firefox此时则完全不会触发这个onchange事件。

  回复  引用  查看    
#9楼2006-03-08 15:39 | 辉狼      
好,俺试一试去,得找个办法,因为客户要求用中文用户名
  回复  引用    
#10楼2006-05-09 10:24 | zhaojc[未注册用户]
呵我用JS实现过支持所有的不过效果不太好有些慢.
DEMO
http://www.txsec.com/SYSTEM/gbg.asp?stockcode=600262&pc=31&DISPLAY=1

  回复  引用    
#11楼2006-06-26 16:52 | oneldg[未注册用户]
你好,你的代码中拥到了System.Collections.Generic vs.net2003中没有啊
如何修改才能在2003下通过呢?谢谢

  回复  引用  查看    
#12楼[楼主]2006-06-26 17:21 | Teddy's Knowledge Base      
@oneldg
改成ArrayList再加上强制类型转换代码就好了。

  回复  引用    
#13楼2006-06-26 17:38 | oneldg[未注册用户]
对了,麻烦问你一下,vs2003下,可以实现 vs.net2005 中 TextBox的autoCompleteType=disable 这个属性吗?也就是使TextBox不能自动保存表单,密码。?