动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > ASP.NET技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ ASP.NET技巧 ]的信息

本月文章推荐
.ASP.NET 2.0 里输出文本格式流.
.DNGuard 一款DotNet内核级加密保.
.ASPX保存远程图片到本地的两种方.
.ASP.NET设计中的性能优化问题.
.cookies的丢失和中文乱码.
.使用UTF-8编码/JMail组件发送邮件.
.ASP.NET 拒绝访问.
.ASP.NET中Session的状态保持方式.
.解决文件下载弹出窗体被拦截 .
.开发ASP.NET Atlas服务器端Exten.
.ACCESS在Web.config里设置连接字.
.让你的.NET应用成为一个灰色盒子.
.在Visual Studio 2005和ASP.NET .
.ASP.NET中数据校验部分的封装与应.
.ASP.Net项目出错处理方法汇总.
.1.1和2.0下进行https请求的不同实.
.图片地址防盗链,通过IHttpHandle.
.如何使用FindControl查找内容页上.
.ASP.NET中的Global.asax以及Web应.
.asp.net结合html,javascript实现.

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

发表日期:2006-2-28 |


这是一个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#region Private Members

        private TextBox textBox = new TextBox();
        private HtmlGenericControl autoCompleteFrame = new HtmlGenericControl();

        private string ToJsStringArray(params string[] strs)
        {
            if (strs != null && strs.Length > 0)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append(" new Array(");

                foreach (string str in strs)
                {
                    sb.Append(string.Format("'{0}', ", str.Replace("'", "\\'")));
                }

                return sb.ToString().TrimEnd(',', ' ') + ");";
            }
            else
            {
                return " new Array;";
            }
        }

        private string MakeUniqueID(string id)
        {
            if (id != null && id.Trim().Length > 0)
            {
                return string.Concat(this.UniqueID.Replace("$", "_"), "_", id);
            }
            else
            {
                return this.UniqueID.Replace("$", "_");
            }
        }

        #endregion

        Properties#region Properties

        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string Text
        {
            get
            {
                if (Page.IsPostBack)
                {
                    textBox.Text = Page.Request.Form[MakeUniqueID("textBox")];
                }
                return textBox.Text;
            }
            set
            {
                textBox.Text = value;
            }
        }

        [Bindable(true)]
        [Category("Behavior")]
        [DefaultValue("")]
        [Localizable(true)]
        public int MaxLength
        {
            get
            {
                return textBox.MaxLength;
            }
            set
            {
                textBox.MaxLength = value;
            }
        }

        [Bindable(true)]
        [Category("Behavior")]
        [DefaultValue(false)]
        [Localizable(true)]
        public bool ReadOnly
        {
            get
            {
                return textBox.ReadOnly;
            }
            set
            {
                textBox.ReadOnly = value;
            }
        }

        public string[] AutoCompleteData
        {
            get
            {
                string[] s = (string[])ViewState["AutoCompleteData"];
                return ((s == null) ? null : s);
            }
            set
            {
                ViewState["AutoCompleteData"] = value;
            }
        }

        #endregion

        Overriden Members#region Overriden Members

        protected override void CreateChildControls()
        {
            create textBox#region create textBox

            textBox.ID = MakeUniqueID("textBox");
            textBox.AutoCompleteType = AutoCompleteType.Disabled;
            textBox.Attributes.Add("onkeypress", string.Format("return __DoAutoComplete(event, '{0}')", MakeUniqueID(null)));
            textBox.Attributes.Add("onblur", string.Format("if (!document.show_{0}) document.getElementById('{1}').style.display = 'none';", MakeUniqueID(null), MakeUniqueID("autoCompleteFrame")));
            textBox.Width = Width;

            #endregion

            create autoCompleteFrame#region create autoCompleteFrame

            autoCompleteFrame.TagName = "iframe";
            autoCompleteFrame.ID = MakeUniqueID("autoCompleteFrame");
            autoCompleteFrame.Attributes.Add("style", "display:none; position: absolute; border: ridge 1px");
            autoCompleteFrame.Attributes.Add("frameborder", "0");
            autoCompleteFrame.Attributes.Add("marginheight", "0");
            autoCompleteFrame.Attributes.Add("marginwidth", "2");
            autoCompleteFrame.Attributes.Add("scrolling", "auto");
            autoCompleteFrame.Attributes.Add("width", Width.ToString());
            autoCompleteFrame.Attributes.Add("height", "100px");
            autoCompleteFrame.Attributes.Add("src", "javascript:''");
            autoCompleteFrame.Attributes.Add("onmouseover", string.Format("document.show_{0} = true;", MakeUniqueID(null)));
            autoCompleteFrame.Attributes.Add("onmouseout", string.Format("document.show_{0} = false;", MakeUniqueID(null)));

            #endregion
        }

        protected override void OnPreRender(EventArgs e)
        {
            Register Client Script Block#region Register Client Script Block

            if (!Page.ClientScript.IsClientScriptBlockRegistered("__DoAutoComplete"))
            {
                string script = string.Concat(
                    "<script language=\"javascript\" type=\"text/javascript\">\r\n",
                    "    var isOpera = navigator.userAgent.indexOf('Opera') > -1;\r\n",
                    "    var isIE = navigator.userAgent.indexOf('MSIE') > 1 && !isOpera;\r\n",
                    "    var isMoz = navigator.userAgent.indexOf('Mozilla/5.') == 0 && !isOpera;\r\n",
                    "\r\n",
                    "    function textboxSelect (oTextbox, iStart, iEnd)\r\n",
                    "    {\r\n",
                    "       switch(arguments.length) {\r\n",
                    "           case 1:\r\n",
                    "               oTextbox.select();\r\n",
                    "               break;\r\n",
                    "\r\n",
                    "           case 2:\r\n",
                    "               iEnd = oTextbox.value.length;\r\n",
                    "               /* falls through */\r\n",
                    "               \r\n",
                    "           case 3:          \r\n",
                    "               if (isIE) {\r\n",
                    "                   var oRange = oTextbox.createTextRange();\r\n",
                    "                   oRange.moveStart(\"character\", iStart);\r\n",
                    "                   oRange.moveEnd(\"character\", -oTextbox.value.length + iEnd);      \r\n",
                    "                   oRange.select();                                              \r\n",
                    "               } else if (isMoz){\r\n",
                    "                   oTextbox.setSelectionRange(iStart, iEnd);\r\n",
                    "               }                    \r\n",
                    "       }\r\n",
                    "\r\n",
                    "       oTextbox.focus();\r\n",
                    "    }\r\n",
                    "\r\n",
                    "    function textboxReplaceSelect (oTextbox, sText)\r\n",
                    "    {\r\n",
                    "       if (isIE) {\r\n",
                    "           var oRange = document.selection.createRange();\r\n",
                    "           oRange.text = sText;\r\n",
                    "           oRange.collapse(true);\r\n",
                    "           oRange.select();                                \r\n",
                    "       } else if (isMoz) {\r\n",
                    "           var iStart = oTextbox.selectionStart;\r\n",
                    "           oTextbox.value = oTextbox.value.substring(0, iStart) + sText + oTextbox.value.substring(oTextbox.selectionEnd, oTextbox.value.length);\r\n",
                    "           oTextbox.setSelectionRange(iStart + sText.length, iStart + sText.length);\r\n",
                    "       }\r\n",
                    "\r\n",
                    "       oTextbox.focus();\r\n",
                    "    }\r\n",
                    "\r\n",
                    "    function autocompleteMatch (sText, arrValues)\r\n",
                    "    {\r\n",
                    "       var retMatches = \"\"; \r\n",
                    "       \r\n",
                    "       for (var i=0; i < arrValues.length; i++)\r\n",
                    "       {\r\n",
                    "           if (arrValues[i].indexOf(sText) == 0)\r\n",
                    "           {\r\n",
                    "               retMatches += arrValues[i] + ',';\r\n",
                    "           }\r\n",
                    "       }\r\n",
                    "      \r\n",
                    "      if (retMatches.length > 0)\r\n",
                    "      {\r\n",
                    "          retMatches = retMatches.substr(0, retMatches.length - 1);\r\n",
                    "      } \r\n",
                    "\r\n",
                    "       return retMatches;\r\n",
                    "    }\r\n",
                    "\r\n",
                    "    function __DoAutoComplete(oEvent, id)\r\n",
                    "    {\r\n",
                    "        var oTextbox = document.getElementById(id + '_textBox');\r\n",
                    "        var frame = document.getElementById(id + '_autoCompleteFrame');\r\n",
                    "        var arrValues =  document[id + '_data'];\r\n",
                    "       \r\n",
                    "        switch (oEvent.keyCode) \r\n",
                    "        {\r\n",
                    "            case 38: //up arrow  \r\n",
                    "            case 40: //down arrow\r\n",
                    "            case 37: //left arrow\r\n",
                    "            case 39: //right arrow\r\n",
                    "            case 33: //page up  \r\n",
                    "            case 34: //page down  \r\n",
                    "            case 36: //home  \r\n",
                    "            case 35: //end                  \r\n",
                    "            case 13: //enter  \r\n",
                    "            case 9: //tab  \r\n",
                    "            case 27: //esc  \r\n",
                    "            case 16: //shift  \r\n",
                    "            case 17: //ctrl  \r\n",
                    "            case 18: //alt  \r\n",
                    "            case 20: //caps lock\r\n",
                    "            case 8: //backspace  \r\n",
                    "            case 46: //delete\r\n",
                    "                return true;\r\n",
                    "                break;\r\n",
                    "                \r\n",
                    "            default:\r\n",
                    "                textboxReplaceSelect(oTextbox, String.fromCharCode(isIE ? oEvent.keyCode : oEvent.charCode));\r\n",
                    "                var iLen = oTextbox.value.length;\r\n",
                    "\r\n",
                    "                var sMatches = autocompleteMatch(oTextbox.value, arrValues);\r\n",
                    "\r\n",
                    "                if (sMatches.length > 0)\r\n",
                    "                {\r\n",
                    "                   var arrMatches = sMatches.split(',');\r\n",
                    "                   oTextbox.value = arrMatches[0];\r\n",
                    "                   textboxSelect(oTextbox, iLen, oTextbox.value.length);\r\n",
                    "                  \r\n",
                    "                   if (arrMatches.length > 1)\r\n",
                    "                   {\r\n",
                    "                        frame.style.display = 'inline';\r\n",
                    "                        frame.height = '100';\r\n",
                    "                        \r\n",
                    "                        frame.contentWindow.document.body.innerHTML = '';\r\n",
                    "                        for (var i = 0; i < arrMatches.length; i++)\r\n",
                    "                        {\r\n",
                    "                            frame.contentWindow.document.body.innerHTML += '<div style=\"width: 100%; cursor: default\" onmouseover=\"this.style.backgroundColor=\\'#316AC5\\'; this.style.color=\\'white\\';\" onmouseout=\"this.style.backgroundColor=\\'\\'; this.style.color=\\'black\\';\" onclick=\"parent.document.getElementById(\\'' + id + '_textBox\\').value = this.innerHTML\">' + arrMatches[i] + '</div>';\r\n",
                    "                        }\r\n",
                    "                        \r\n",
                    "                        frame.contentWindow.document.body.style.backgroundColor = 'white';\r\n",
                    "                        frame.contentWindow.document.onclick = function() { document.getElementById(id + '_autoCompleteFrame').style.display = 'none'; };\r\n",
                    "                   }  \r\n",
                    "                }  \r\n",
                    "                \r\n",
                    "                return false;\r\n",
                    "        }        \r\n",
                    "    }\r\n",
                    "</script>\r\n",
                    "");
                Page.ClientScript.RegisterClientScriptBlock(typeof(string), "__DoAutoComplete", script);
            }

            if (!Page.ClientScript.IsClientScriptBlockRegistered(MakeUniqueID("data")))
            {
                Page.ClientScript.RegisterClientScriptBlock(typeof(string), MakeUniqueID("data"), string.Format("<script language=\"javascript\" type=\"text/javascript\">document.{0}_data = {1}</script>", MakeUniqueID(null), ToJsStringArray(AutoCompleteData)));
            }

            #endregion
        }

        protected override void RenderContents(HtmlTextWriter output)
        {
            output.WriteLine(string.Format("<div onmouseleave=\"document.getElementById('{0}').style.display = 'none';\" style=\"width:{1}\" >", MakeUniqueID("autoCompleteFrame"), Width));
            textBox.RenderControl(output);
            output.WriteLine("<br />");
            autoCompleteFrame.RenderControl(output);
            output.WriteLine("</div>");
        }

        #endregion
    }
}
下载

http://teddyma.cnblogs.com/Files/teddyma/AutoCompleteTextBox.zip

上一篇:ASP.NET小技巧:重写ViewState的存储目的地,以提高页面性能 人气:6546
下一篇:Asp.net把UTF-8编码转换为GB2312编码 人气:13098
浏览全部ASP.NET的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-12 team论坛 v2.0.4 bulid 080916 A
2008-10-12 Roclog v3.1.6
2008-10-12 SupeV v1.0.1 简体中文 GBK
2008-10-12 NetCMS v1.6.0.1010 正式版
2008-10-12 PHP考试系统PPFrame v1.2.7
2008-10-12 LPAS个人相册 v1.6.3
2008-10-12 快问仿百度知道系统 动态-静态-互
2008-10-12 方卡广告防点击系统 V1.0 GB2312
2008-10-12 泡菜内容管理系统[PCMS] v1.0 Bu
2008-10-11 联系人分组工具 v1.1 中文破解版
2008-10-11 FaceMelter变脸 v2.0 汉化破解版
2008-10-11 PathTracker道路跟踪仪 v1.2 破解
2008-10-11 Rooms手机聊天室 v0.6.7 破解版
2008-10-11 RemoteDesktop远程桌面 v1.0 破解
2008-10-11 ProRemote远程调音台 v1.0.1 破解
2008-10-11 PicShare照片共享 v1.0.0 破解版
2008-10-11 Photogene照片编辑器 v1.5 汉化破
2008-10-11 WriteRoom共享文档 v1.0 破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成