Это AutoCompleteTextBox, который недавно инкапсулировал Тедди. Мы знаем, что собственный TextBox ASP.NET также поддерживает определенные функции автозаполнения, но он зависит от реализации браузера и не может указывать собственные кандидаты автозаполнения. AutoCompleteTextBox, указанный в этой статье, компенсирует этот недостаток. Просто установите свойство AutoCompleteTextBox.AutoCompleteData и передайте строку[], чтобы TextBox поддерживал пользовательских кандидатов.
Если нет кандидата, соответствующего текущему вводу,логика автозаполнения
будет такой же, как и у обычного текстового поля;
Если только один кандидат соответствует текущему вводу, он автоматически завершается;
Если текущим входным данным соответствует более одного кандидата, первый кандидат автоматически заполняется в текстовом поле и появляется всплывающее окно, содержащее всех кандидатов.
Исходный код реализации
скомпилирован в VS2005, но на самом деле почти не используется синтаксис, основанный на версии 2.0, и его можно скомпилировать под vs2003 с минимальными изменениями.
использование системы;
использование System.Collections.Generic;
использование System.ComponentModel;
использование System.Text;
использование System.Web;
использование System.Web.UI;
использование System.Web.UI.WebControls;
использование
пространства имен System.Web.UI.HtmlControls Ilungasoft.Framework.Web.UI.WebControls
;
{
[ToolboxData("<{0}:AutoCompleteTextBox runat=server></{0}:AutoCompleteTextBox>")]
открытый класс AutoCompleteTextBox: WebControl
{
Частные члены#регион Частные члены
частный TextBox textBox = new TextBox();
частный HtmlGenericControl autoCompleteFrame = новый HtmlGenericControl ()
частная строка ToJsStringArray (params string [] strs)
{
if (strs != null && strs.Length > 0)
{
StringBuilder sb = новый StringBuilder();
sb.Append(" new Array(");
foreach (строка str в строках)
{
sb.Append(string.Format("'{0}', ", str.Replace("'", " \' ")));
}
return sb.ToString().TrimEnd(',', ' ') + ");";
}
еще
{
вернуть «новый массив;»;
}
}
частная строка MakeUniqueID (идентификатор строки)
{
if (id != null && id.Trim().Length > 0)
{
return string.Concat(this.UniqueID.Replace("$", "_"), "_", id);
}
еще
{
return this.UniqueID.Replace("$", "_");
}
}
#endregion
Properties#region Properties
[Bindable(true)]
[Категория("Внешний вид")]
[Значение По умолчанию("")]
[Локализируемый (правда)]
общедоступная строка Текст
{
получать
{
если (Page.IsPostBack)
{
textBox.Text = Page.Request.Form[MakeUniqueID("textBox")];
}
вернуть текстовое поле.Текст;
}
набор
{
textBox.Text = значение;
}
}
[Привязываемый (истина)]
[Категория("Поведение")]
[Значение По умолчанию("")]
[Локализируемый (правда)]
public int MaxLength
{
получать
{
вернуть textBox.MaxLength;
}
набор
{
textBox.MaxLength = значение;
}
}
[Привязываемый (истина)]
[Категория("Поведение")]
[Значение по умолчанию (ложь)]
[Локализируемый (правда)]
public bool ReadOnly
{
получать
{
вернуть textBox.ReadOnly;
}
набор
{
textBox.ReadOnly = значение;
}
}
общественная строка[] AutoCompleteData
{
получать
{
string[] s = (string[])ViewState["AutoCompleteData"];
return ((s == null) ? null: s);
}
набор
{
ViewState["AutoCompleteData"] = значение;
}
}
#endregion
Overriden Members#region Overriden Members
protected override void CreateChildControls()
{
создать textBox#region создать 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 = Ширина;
#endregion
create autoCompleteFrame#region create autoCompleteFrame
autoCompleteFrame.TagName = "iframe";
autoCompleteFrame.ID = MakeUniqueID("autoCompleteFrame");
autoCompleteFrame.Attributes.Add("стиль", "дисплей: нет; позиция: абсолютная; граница: выступ 1 пиксель");
autoCompleteFrame.Attributes.Add("рамка", "0");
autoCompleteFrame.Attributes.Add("высота поля", "0");
autoCompleteFrame.Attributes.Add("ширина поля", "2");
autoCompleteFrame.Attributes.Add("прокрутка", "авто");
autoCompleteFrame.Attributes.Add("ширина", Width.ToString());
autoCompleteFrame.Attributes.Add("высота", "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
}
защищенное переопределение void OnPreRender(EventArgs e)
{
Зарегистрировать блок клиентских сценариев#region Зарегистрировать блок клиентских сценариев
if (!Page.ClientScript.IsClientScriptBlockRegistered("__DoAutoComplete"))
{
строковый скрипт = string.Concat(
"<script Language="javascript" type="text/javascript">rn",
" var isOpera = navigator.userAgent.indexOf('Opera') > -1;rn",
" var isIE = navigator.userAgent.indexOf('MSIE') > 1 && !isOpera;rn",
" var isMoz = navigator.userAgent.indexOf('Mozilla/5.') == 0 && !isOpera;rn",
"рн",
" функция textboxSelect (oTextbox, iStart, iEnd)rn",
" {rn",
" переключатель(arguments.length) {rn",
"случай 1:rn",
" oTextbox.select();rn",
" перерыв;rn",
"рн",
"случай 2:rn",
" iEnd = oTextbox.value.length;rn",
" /* проваливается через */rn",
"рн",
"случай 3: rn",
" если (isIE) {rn",
"var oRange = oTextbox.createTextRange();rn",
" oRange.moveStart("символ", iStart);rn",
" oRange.moveEnd("символ", -oTextbox.value.length + iEnd); rn",
" oRange.select(); rn",
" } else if (isMoz){rn",
" oTextbox.setSelectionRange(iStart, iEnd);rn",
" } rn",
" }rn",
"рн",
" oTextbox.focus();rn",
" }rn",
"рн",
" функция textboxReplaceSelect (oTextbox, sText)rn",
" {rn",
" если (isIE) {rn",
"var oRange = document.selection.createRange();rn",
" oRange.text = sText;rn",
" oRange.collapse(true);rn",
" oRange.select(); rn",
" } else if (isMoz) {rn",
"var iStart = oTextbox.selectionStart;rn",
" oTextbox.value = oTextbox.value.substring(0, iStart) + sText + oTextbox.value.substring(oTextbox.selectionEnd, oTextbox.value.length);rn",
" oTextbox.setSelectionRange(iStart + sText.length, iStart + sText.length);rn",
" }rn",
"рн",
" oTextbox.focus();rn",
" }rn",
"рн",
" функция autocompleteMatch (sText, arrValues)rn",
" {rn",
" var retMatches = ""; rn",
"рн",
" for (var i=0; i < arrValues.length; i++)rn",
" {rn",
" if (arrValues[i].indexOf(sText) == 0)rn",
" {rn",
" retMatches += arrValues[i] + ',';rn",
" }rn",
" }rn",
"рн",
" if (retMatches.length > 0)rn",
" {rn",
" retMatches = retMatches.substr(0, retMatches.length - 1);rn",
" } rn",
"рн",
" return retMatches;rn",
" }rn",
"рн",
" функция __DoAutoComplete(oEvent, id)rn",
" {rn",
" var oTextbox = document.getElementById(id + '_textBox');rn",
" varframe = document.getElementById(id + '_autoCompleteFrame');rn",
" var arrValues = document[id + '_data'];rn",
"рн",
"переключатель (oEvent.keyCode) rn",
" {rn",
" случай 38: //стрелка вверх rn",
"случай 40: //стрелка внизrn",
"случай 37: //стрелка влевоrn",
"случай 39: //стрелка вправоrn",
" случай 33: // страница вверх rn",
" случай 34: // страница вниз rn",
" случай 36: //дом rn",
" случай 35: //конец rn",
" случай 13: //введите rn",
" случай 9: //вкладка rn",
" случай 27: //esc rn",
" случай 16: //сдвиг rn",
" случай 17: //ctrl rn",
" случай 18: //alt rn",
"случай 20: //caps lockrn",
" случай 8: //возврат rn",
"случай 46: //удалитьrn",
" вернуть истину;rn",
" перерыв;rn",
"рн",
"по умолчанию:rn",
" textboxReplaceSelect(oTextbox, String.fromCharCode(isIE ? oEvent.keyCode : oEvent.charCode));rn",
" var iLen = oTextbox.value.length;rn",
"рн",
" var sMatches = autocompleteMatch(oTextbox.value, arrValues);rn",
"рн",
" if (sMatches.length > 0)rn",
" {rn",
"var arrMatches = sMatches.split(',');rn",
" oTextbox.value = arrMatches[0];rn",
" textboxSelect(oTextbox, iLen, oTextbox.value.length);rn",
"рн",
" if (arrMatches.length > 1)rn",
" {rn",
"frame.style.display = 'inline';rn",
"frame.height = '100';rn",
"рн",
"frame.contentWindow.document.body.innerHTML = '';rn",
" for (var i = 0; i < arrMatches.length; i++)rn",
" {rn",
"frame.contentWindow.document.body.innerHTML += '<div style="width: 100%; курсор: default" onmouseover="this.style.backgroundColor=\'#316AC5\'; style.color=\'white\';" onmouseout="this.style.backgroundColor=\'\'; this.style.color=\'black\';" onclick= "parent.document.getElementById( \'' + id + '_textBox\').value = this.innerHTML">' + arrMatches[i] + '</div>';rn",
" }rn",
"рн",
"frame.contentWindow.document.body.style.backgroundColor = 'white';rn",
"frame.contentWindow.document.onclick = function() { document.getElementById(id + '_autoCompleteFrame').style.display = 'none'; };rn",
" } rn",
" } rn",
"рн",
" вернуть ложь;rn",
" } rn",
" }rn",
"</script>rn",
"");
Page.ClientScript.RegisterClientScriptBlock(typeof(string), "__DoAutoComplete", скрипт);
}
if (!Page.ClientScript.IsClientScriptBlockRegistered(MakeUniqueID("данные")))
{
Page.ClientScript.RegisterClientScriptBlock(typeof(string), MakeUniqueID("data"), string.Format("<script Language="javascript" type="text/javascript">document.{0}_data = { 1</script>", MakeUniqueID(null), ToJsStringArray(AutoCompleteData)));
}
#конечныйрегион
}
защищенное переопределение void RenderContents (вывод HtmlTextWriter)
{
output.WriteLine(string.Format("<div onmouseleave="document.getElementById('{0}').style.display = 'none';" style="width:{1}" >", MakeUniqueID("autoCompleteFrame"), Ширина));
textBox.RenderControl(выход);
output.WriteLine("<br />");
autoCompleteFrame.RenderControl(выход);
вывод.WriteLine("</div>");
}
#конечныйрегион
}
}
скачать