Este é um AutoCompleteTextBox que Teddy encapsulou recentemente. Sabemos que o próprio TextBox do ASP.NET também oferece suporte a determinadas funções de AutoComplete, mas depende da implementação do navegador e não pode especificar candidatos personalizados de AutoComplete. O AutoCompleteTextBox listado neste artigo compensa essa deficiência. Basta definir a propriedade AutoCompleteTextBox.AutoCompleteData e passar uma string[] para fazer com que o TextBox suporte candidatos personalizados.
Se não houver nenhum candidato correspondente à entrada atual,a lógica do AutoComplete
será a mesma de um TextBox normal;
Se apenas um candidato corresponder à entrada atual, ele será automaticamente concluído;
Se mais de um candidato corresponder à entrada atual, o primeiro candidato será automaticamente preenchido na caixa de texto e uma caixa pop-up contendo todos os candidatos será exibida.
-fonte da implementação
é compilado no VS2005, mas na verdade quase nenhuma sintaxe que depende do 2.0 é usada e pode ser compilado no vs2003 com modificações mínimas.
usando o sistema;
usando System.Collections.Generic;
usando System.ComponentModel;
usando System.Text;
usando System.Web;
usando System.Web.UI;
usando System.Web.UI.WebControls;
usando o namespace System.Web.UI.HtmlControls
Ilungasoft.Framework.Web.UI.WebControls
;
{
[ToolboxData("<{0}:AutoCompleteTextBox runat=server></{0}:AutoCompleteTextBox>")]
classe pública AutoCompleteTextBox: WebControl
{
Membros Privados#região Membros Privados
private TextBox textBox = new TextBox();
private HtmlGenericControl autoCompleteFrame = new HtmlGenericControl()
string privada ToJsStringArray(params string[] strs)
{
if (strs! = nulo && strs.Length > 0)
{
StringBuilder sb = new StringBuilder();
sb.Append("new Array(");
foreach (string str em strs)
{
sb.Append(string.Format("'{0}', ", str.Replace("'", " \' ")));
}
return sb.ToString().TrimEnd(',', ' ') + ");";
}
outro
{
return "nova matriz;";
}
}
string privada MakeUniqueID(string id)
{
if (id! = null && id.Trim().Length > 0)
{
retornar string.Concat(this.UniqueID.Replace("$", "_"), "_", id);
}
outro
{
retornar this.UniqueID.Replace("$", "_");
}
}
#
Propriedadesendregion#Propriedadesregion
[Vinculável(true)]
[Categoria("Aparência")]
[Valor Padrão("")]
[Localizável (verdadeiro)]
string pública Texto
{
pegar
{
se (Página.IsPostBack)
{
textBox.Text = Page.Request.Form[MakeUniqueID("textBox")];
}
retornar textBox.Text;
}
definir
{
textBox.Text = valor;
}
}
[Vinculável (verdadeiro)]
[Categoria("Comportamento")]
[Valor Padrão("")]
[Localizável (verdadeiro)]
público int MaxLength
{
pegar
{
retornar textBox.MaxLength;
}
definir
{
textBox.MaxLength = valor;
}
}
[Vinculável (verdadeiro)]
[Categoria("Comportamento")]
[Valor padrão (falso)]
[Localizável (verdadeiro)]
bool público Somente leitura
{
pegar
{
retornar textBox.ReadOnly;
}
definir
{
textBox.ReadOnly = valor;
}
}
string pública[] AutoCompleteData
{
pegar
{
string[] s = (string[])ViewState["AutoCompleteData"];
retornar ((s == nulo)? nulo: s);
}
definir
{
ViewState["AutoCompleteData"] = valor;
}
}
#endregion
Membros substituídos#region Membros substituídos
protected override void CreateChildControls()
{
criar textBox#região criar textBox
textBox.ID = MakeUniqueID("textBox");
textBox.AutoCompleteType = AutoCompleteType.Disabled;
textBox.Attributes.Add("onkeypress", string.Format("return __DoAutoComplete(evento, '{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 = Largura;
#endregion
criar autoCompleteFrame#region criar autoCompleteFrame
autoCompleteFrame.TagName = "iframe";
autoCompleteFrame.ID = MakeUniqueID("autoCompleteFrame");
autoCompleteFrame.Attributes.Add("estilo", "display:none; posição: absoluta; borda: cume 1px");
autoCompleteFrame.Attributes.Add("frameborder", "0");
autoCompleteFrame.Attributes.Add("marginheight", "0");
autoCompleteFrame.Attributes.Add("largura da margem", "2");
autoCompleteFrame.Attributes.Add("rolagem", "auto");
autoCompleteFrame.Attributes.Add("largura", Width.ToString());
autoCompleteFrame.Attributes.Add("altura", "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)))
;
}
substituição protegida void OnPreRender(EventArgs e)
{
Registrar bloco de script de cliente#region Registrar bloco de script de cliente
if (!Page.ClientScript.IsClientScriptBlockRegistered("__DoAutoComplete"))
{
script de string = string.Concat(
"<linguagem de script="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",
"rn",
" função textboxSelect (oTextbox, iStart, iEnd)rn",
" {rn",
" switch(argumentos.length) {rn",
"caso 1:rn",
"oTextbox.select();rn",
" pausa;rn",
"rn",
"caso 2:rn",
" iEnd = oTextbox.valor.comprimento;rn",
" /* falha */rn",
"rn",
"caso 3:rn",
"se (éIE) {rn",
"var oRange = oTextbox.createTextRange();rn",
" oRange.moveStart("personagem", iStart);rn",
" oRange.moveEnd("caractere", -oTextbox.valor.comprimento + iEnd); rn",
" oRange.select(); rn",
" } else if (isMoz){rn",
" oTextbox.setSelectionRange(iStart, iEnd);rn",
" }rn",
" }rn",
"rn",
" oTextbox.focus();rn",
" }rn",
"rn",
" função textboxReplaceSelect (oTextbox, sText)rn",
" {rn",
"se (éIE) {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",
"rn",
" oTextbox.focus();rn",
" }rn",
"rn",
" função autocompleteMatch (sText, arrValues)rn",
" {rn",
" var retMatches = ""; rn",
"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",
"rn",
"se (retMatches.length > 0)rn",
" {rn",
" retMatches = retMatches.substr(0, retMatches.length - 1);rn",
" }rn",
"rn",
" retornar retMatches;rn",
" }rn",
"rn",
" função __DoAutoComplete(oEvent, id)rn",
" {rn",
"var oTextbox = document.getElementById(id + '_textBox');rn",
" var frame = document.getElementById(id + '_autoCompleteFrame');rn",
" var arrValues = documento[id + '_data'];rn",
"rn",
"switch (oEvent.keyCode)rn",
" {rn",
" case 38: //seta para cima rn",
"caso 40: //seta para baixorn",
"caso 37: //seta para esquerdarn",
"caso 39: //seta para direitarn",
" case 33: //página acima rn",
" case 34: //página abaixo rn",
"caso 36: //homern",
"caso 35: //fim rn",
"caso 13: //digite rn",
"caso 9: //guia rn",
"caso 27: //escrn",
"caso 16: //shiftrn",
"caso 17: //ctrlrn",
"caso 18: //altrn",
"caso 20: //caps lockrn",
"caso 8: //backspace rn",
"caso 46: //excluirrn",
" retornar verdadeiro;rn",
" pausa;rn",
"rn",
"padrão:rn",
" textboxReplaceSelect(oTextbox, String.fromCharCode(isIE ? oEvent.keyCode : oEvent.charCode));rn",
" var iLen = oTextbox.valor.comprimento;rn",
"rn",
" var sMatches = autocompleteMatch(oTextbox.value, arrValues);rn",
"rn",
" if (sMatches.length > 0)rn",
" {rn",
"var arrMatches = sMatches.split(',');rn",
" oTextbox.value = arrMatches[0];rn",
" textboxSelect(oTextbox, iLen, oTextbox.value.length);rn",
"rn",
"se (arrMatches.length > 1)rn",
" {rn",
"frame.style.display = 'inline';rn",
"quadro.altura = '100';rn",
"rn",
" frame.contentWindow.document.body.innerHTML = '';rn",
" for (var i = 0; i < arrMatches.length; i++)rn",
" {rn",
" frame.contentWindow.document.body.innerHTML += '<div style="largura: 100%; cursor: padrão" 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",
"rn",
" frame.contentWindow.document.body.style.backgroundColor = 'branco';rn",
" frame.contentWindow.document.onclick = function() { document.getElementById(id + '_autoCompleteFrame').style.display = 'none'; };rn",
" }rn",
" }rn",
"rn",
" retornar falso;rn",
" }rn",
" }rn",
"</script>rn",
"");
Page.ClientScript.RegisterClientScriptBlock(typeof(string), "__DoAutoComplete", script);
}
if (!Page.ClientScript.IsClientScriptBlockRegistered(MakeUniqueID("dados")))
{
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
}
substituição protegida void RenderContents (saída HtmlTextWriter)
{
saída.WriteLine(string.Format("<div onmouseleave="document.getElementById('{0}').style.display = 'none';" style="largura:{1}" >", MakeUniqueID("autoCompleteFrame"), Largura));
textBox.RenderControl(saída);
saída.WriteLine("<br />");
autoCompleteFrame.RenderControl(saída);
saída.WriteLine("</div>");
}
#endregion
}
}
download