Este es un AutoCompleteTextBox que Teddy encapsuló recientemente. Sabemos que el propio TextBox de ASP.NET también admite ciertas funciones de Autocompletar, pero depende de la implementación del navegador y no puede especificar candidatos de Autocompletar personalizados. El AutoCompleteTextBox enumerado en este artículo compensa esta deficiencia. Simplemente configure la propiedad AutoCompleteTextBox.AutoCompleteData y pase una cadena [] para que el TextBox admita candidatos personalizados.
Si no hay ningún candidato que coincida con la entrada actual,la lógica de Autocompletar
será la misma que la de un cuadro de texto normal;
Si sólo un candidato coincide con la entrada actual, se completa automáticamente;
Si más de un candidato coincide con la entrada actual, el primer candidato se completa automáticamente en el cuadro de texto y aparece un cuadro emergente que contiene todos los candidatos.
fuente de implementación
está compilado en VS2005, pero de hecho, casi no se utiliza ninguna sintaxis que dependa de 2.0 y se puede compilar en vs2003 con modificaciones mínimas.
usando Sistema;
usando System.Collections.Generic;
usando System.ComponentModel;
usando System.Text;
usando System.Web;
utilizando System.Web.UI;
usando System.Web.UI.WebControls;
usando System.Web.UI.HtmlControls;
espacio de nombres Ilungasoft.Framework.Web.UI.WebControls;
{
[ToolboxData("<{0}:AutoCompleteTextBox runat=servidor></{0}:AutoCompleteTextBox>")]
clase pública AutoCompleteTextBox: WebControl
{
Miembros privados#región Miembros privados
cuadro de texto privado cuadro de texto = nuevo cuadro de texto();
HtmlGenericControl privado autoCompleteFrame = nuevo HtmlGenericControl();
cadena privada ToJsStringArray (cadena de parámetros [] cadenas)
{
si (cadenas! = nulo && cadenas.Longitud > 0)
{
StringBuilder sb = nuevo StringBuilder();
sb.Append(" new Array(");
foreach (cadena cadena en cadenas)
{
sb.Append(string.Format("'{0}', ", str.Replace("'", " \' ")));
}
return sb.ToString().TrimEnd(',', ' ') + ");";
}
demás
{
devolver "nueva matriz;";
}
}
cadena privada MakeUniqueID (id de cadena)
{
si (id! = nulo && id.Trim().Longitud > 0)
{
return string.Concat(this.UniqueID.Replace("$", "_"), "_", id);
}
demás
{
devuelve this.UniqueID.Replace("$", "_");
}
}
#endregion
Propiedades#región Propiedades
[Enlazable(verdadero)]
[Categoría ("Apariencia")]
[Valor predeterminado ("")]
[Localizable(verdadero)]
Texto de cadena pública
{
conseguir
{
si (Página.IsPostBack)
{
textBox.Text = Page.Request.Form[MakeUniqueID("textBox")];
}
devolver cuadro de texto.Texto;
}
colocar
{
cuadro de texto.Texto = valor;
}
}
[Enlazable (verdadero)]
[Categoría ("Comportamiento")]
[Valor predeterminado ("")]
[Localizable(verdadero)]
público int MaxLength
{
conseguir
{
devolver cuadro de texto.MaxLength;
}
colocar
{
textBox.MaxLength = valor;
}
}
[Enlazable (verdadero)]
[Categoría ("Comportamiento")]
[Valor predeterminado (falso)]
[Localizable(verdadero)]
bool público de sólo lectura
{
conseguir
{
devolver cuadro de texto.ReadOnly;
}
colocar
{
textBox.ReadOnly = valor;
}
}
cadena pública[] AutoCompleteData
{
conseguir
{
cadena[] s = (cadena[])ViewState["AutoCompleteData"];
return ((s == nulo) ? nulo: s);
}
colocar
{
ViewState["AutoCompleteData"] = valor;
}
}
#endregion
Miembros anulados#región Miembros anulados
protected anulación void CreateChildControls()
{
crear cuadro de texto#región crear cuadro de texto
textBox.ID = MakeUniqueID("cuadro de texto");
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 = Ancho;
#endregion
crear autoCompleteFrame#region crear autoCompleteFrame
autoCompleteFrame.TagName = "iframe";
autoCompleteFrame.ID = MakeUniqueID("autoCompleteFrame");
autoCompleteFrame.Attributes.Add("estilo", "pantalla: ninguna; posición: absoluta; borde: cresta 1px");
autoCompleteFrame.Attributes.Add("frameborder", "0");
autoCompleteFrame.Attributes.Add("marginheight", "0");
autoCompleteFrame.Attributes.Add("ancho de margen", "2");
autoCompleteFrame.Attributes.Add("desplazamiento", "automático");
autoCompleteFrame.Attributes.Add("ancho", Ancho.ToString());
autoCompleteFrame.Attributes.Add("altura", "100px");
autoCompleteFrame.Attributes.Add("src", "javascript:''");
autoCompleteFrame.Attributes.Add("onmouseover", string.Format("document.show_{0} = true;", MakeUniqueID(null)));
"
onmouseout", string.Format("document.show_{0} = false;", MakeUniqueID(null)));
}
anulación protegida nula OnPreRender (EventArgs e)
{
Registrar bloque de script de cliente#región Registrar bloque de script de cliente
if (!Page.ClientScript.IsClientScriptBlockRegistered("__DoAutoComplete"))
{
secuencia de comandos de cadena = cadena.Concat(
"<script language="javascript" tipo="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",
"rn",
"función textboxSelect (oTextbox, iStart, iEnd)rn",
" {rn",
" cambiar(argumentos.longitud) {rn",
"caso 1:rn",
" oTextbox.select();rn",
" descanso;rn",
"rn",
"caso 2:rn",
"iEnd = oTextbox.value.length;rn",
" /* falla */rn",
"rn",
" caso 3: rn",
"si (esIE) {rn",
"var oRange = oTextbox.createTextRange();rn",
" oRange.moveStart("carácter", iStart);rn",
" oRange.moveEnd("carácter", -oTextbox.value.length + iEnd); rn",
" oRange.select(); rn",
" } si no (isMoz){rn",
" oTextbox.setSelectionRange(iStart, iEnd);rn",
" } rn",
" }rn",
"rn",
" oTextbox.focus();rn",
" }rn",
"rn",
"función textboxReplaceSelect (oTextbox, sText)rn",
" {rn",
"si (esIE) {rn",
"var oRange = document.selection.createRange();rn",
" oRange.text = sText;rn",
" oRange.collapse(verdadero);rn",
" oRange.select(); rn",
" } si no (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",
"rn",
" oTextbox.focus();rn",
" }rn",
"rn",
"función autocompletarMatch (sText, arrValues)rn",
" {rn",
" var retMatches = ""; rn",
"rn",
"para (var i=0; i < arrValues.length; i++)rn",
" {rn",
"if (arrValues[i].indexOf(sText) == 0)rn",
" {rn",
" retMatches += arrValues[i] + ',';rn",
" }rn",
" }rn",
"rn",
"si (retMatches.length > 0)rn",
" {rn",
" retMatches = retMatches.substr(0, retMatches.length - 1);rn",
" } rn",
"rn",
" return retMatches;rn",
" }rn",
"rn",
"función __DoAutoComplete(oEvent, id)rn",
" {rn",
" var oTextbox = document.getElementById(id + '_textBox');rn",
" var marco = document.getElementById(id + '_autoCompleteFrame');rn",
" var arrValues = documento[id + '_data'];rn",
"rn",
" cambiar (oEvent.keyCode) rn",
" {rn",
" caso 38: //flecha hacia arriba rn",
"caso 40: //flecha hacia abajorn",
"caso 37: //flecha izquierdarn",
"caso 39: //flecha derecharn",
"caso 33: //retroceder página rn",
"caso 34: //página abajo rn",
" caso 36: //inicio rn",
" caso 35: //fin rn",
" caso 13: //ingrese rn",
" caso 9: //pestaña rn",
" caso 27: //esc rn",
" caso 16: //cambio rn",
" caso 17: //ctrl rn",
" caso 18: //alt rn",
"caso 20: //bloqueo de mayúsculasrn",
"caso 8: //retroceso rn",
"caso 46: //eliminarrn",
"devuelve verdadero;rn",
" descanso;rn",
"rn",
"predeterminado:rn",
" textboxReplaceSelect(oTextbox, String.fromCharCode(isIE ? oEvent.keyCode : oEvent.charCode));rn",
" var iLen = oTextbox.value.length;rn",
"rn",
" var sMatches = autocompleteMatch(oTextbox.value, arrValues);rn",
"rn",
"si (sMatches.length > 0)rn",
" {rn",
"var arrMatches = sMatches.split(',');rn",
" oTextbox.value = arrMatches[0];rn",
" textboxSelect(oTextbox, iLen, oTextbox.value.length);rn",
"rn",
"si (arrMatches.length > 1)rn",
" {rn",
" frame.style.display = 'en línea';rn",
" marco.altura = '100';rn",
"rn",
" frame.contentWindow.document.body.innerHTML = '';rn",
"para (var i = 0; i < arrMatches.length; i++)rn",
" {rn",
" frame.contentWindow.document.body.innerHTML += '<div style="width: 100%; cursor: default" onmouseover="this.style.backgroundColor=\'#316AC5\'; style.color=\'blanco\';" onmouseout="this.style.backgroundColor=\'\' this.style.color=\'negro\';" onclick= "parent.document.getElementById( \'' + id + '_textBox\').value = this.innerHTML">' + arrMatches[i] + '</div>';rn",
" }rn",
"rn",
" frame.contentWindow.document.body.style.backgroundColor = 'blanco';rn",
" frame.contentWindow.document.onclick = function() { document.getElementById(id + '_autoCompleteFrame').style.display = 'none'; };rn",
" } rn",
" } rn",
"rn",
" devuelve falso;rn",
" } rn",
" }rn",
"</script>rn",
"");
Page.ClientScript.RegisterClientScriptBlock(tipo de(cadena), "__DoAutoComplete", script);
}
if (!Page.ClientScript.IsClientScriptBlockRegistered(MakeUniqueID("datos")))
{
Page.ClientScript.RegisterClientScriptBlock(tipo de(cadena), MakeUniqueID("datos"), cadena.Format("<lenguaje de script="javascript" tipo="text/javascript">document.{0}_data = { 1}</script>", MakeUniqueID(null), ToJsStringArray(AutoCompleteData)));
}
#endregion
}
anulación protegida void RenderContents (salida de HtmlTextWriter)
{
salida.WriteLine(string.Format("<div onmouseleave="document.getElementById('{0}').style.display = 'none';" style="width:{1}" >", MakeUniqueID("autoCompleteFrame"), Ancho));
textBox.RenderControl(salida);
salida.WriteLine("<br />");
autoCompleteFrame.RenderControl(salida);
salida.WriteLine("</div>");
}
#endregion
}
}
descargar