Il s'agit d'une AutoCompleteTextBox que Teddy a récemment encapsulée. Nous savons que TextBox d'ASP.NET prend également en charge certaines fonctions de saisie semi-automatique, mais il repose sur l'implémentation du navigateur et ne peut pas spécifier de candidats de saisie semi-automatique personnalisés. La AutoCompleteTextBox répertoriée dans cet article compense cette lacune. Définissez simplement la propriété AutoCompleteTextBox.AutoCompleteData et transmettez une chaîne[] pour que TextBox prenne en charge les candidats personnalisés.
S'il n'y a aucun candidat correspondant à l'entrée actuelle,la logique de saisie semi-automatique
sera la même qu'une TextBox normale ;
Si un seul candidat correspond à la saisie actuelle, celle-ci est automatiquement complétée ;
Si plusieurs candidats correspondent à l'entrée actuelle, le premier candidat est automatiquement complété dans la zone de texte et une boîte contextuelle contenant tous les candidats apparaît.
source d'implémentation
est compilé dans VS2005, mais en fait, presque aucune syntaxe reposant sur 2.0 n'est utilisée, et il peut être compilé sous vs2003 avec des modifications minimes.
utiliser le système ;
en utilisant System.Collections.Generic ;
en utilisant System.ComponentModel ;
en utilisant System.Text ;
en utilisant System.Web ;
en utilisant System.Web.UI ;
en utilisant System.Web.UI.WebControls ;
en utilisant System.Web.UI.HtmlControls ;
espace de noms Ilungasoft.Framework.Web.UI.WebControls ;
{
[ToolboxData("<{0}:AutoCompleteTextBox runat=server></{0}:AutoCompleteTextBox>")]
classe publique AutoCompleteTextBox : WebControl
{
Membres privés#region Membres privés
private TextBox textBox = new TextBox();
private HtmlGenericControl autoCompleteFrame = new HtmlGenericControl();
chaîne privée ToJsStringArray(params string[] strs)
{
si (strs != null && strs.Length > 0)
{
StringBuilder sb = new StringBuilder();
sb.Append(" new Array(");
foreach (chaîne str en chaînes)
{
sb.Append(string.Format("'{0}', ", str.Replace("'", " \' ")));
}
return sb.ToString().TrimEnd(',', ' ') + ");";
}
autre
{
return "nouveau tableau;";
}
}
chaîne privée MakeUniqueID (identifiant de chaîne)
{
if (id != null && id.Trim().Length > 0)
{
return string.Concat(this.UniqueID.Replace("$", "_"), "_", id);
}
autre
{
renvoie this.UniqueID.Replace("$", "_");
}
}
#endregion
#Propriétés de la région
[Bindable (true)]
[Catégorie("Apparence")]
[Valeur par défaut("")]
[Localisable (vrai)]
chaîne publique Texte
{
obtenir
{
si (Page.IsPostBack)
{
textBox.Text = Page.Request.Form[MakeUniqueID("textBox"]);
}
renvoyer textBox.Text ;
}
ensemble
{
textBox.Text = valeur ;
}
}
[Liable (vrai)]
[Catégorie("Comportement")]
[Valeur par défaut("")]
[Localisable (vrai)]
public int MaxLength
{
obtenir
{
retourner textBox.MaxLength;
}
ensemble
{
textBox.MaxLength = valeur ;
}
}
[Liable (vrai)]
[Catégorie("Comportement")]
[Valeur par défaut (faux)]
[Localisable (vrai)]
public bool Lecture seule
{
obtenir
{
retourner textBox.ReadOnly ;
}
ensemble
{
textBox.ReadOnly = valeur ;
}
}
chaîne publique[] DonnéesCompleteAuto
{
obtenir
{
string[] s = (string[])ViewState["AutoCompleteData"];
return ((s == null) ? null : s);
}
ensemble
{
ViewState["AutoCompleteData"] = valeur ;
}
}
#endregion
Membres remplacés#region Membres remplacés
protected override void CreateChildControls()
{
créer textBox#region créer 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 = Largeur ;
#endregion
créer autoCompleteFrame#region créer autoCompleteFrame
autoCompleteFrame.TagName = "iframe" ;
autoCompleteFrame.ID = MakeUniqueID("autoCompleteFrame");
autoCompleteFrame.Attributes.Add("style", "display:none; position: absolue; bordure: crête 1px");
autoCompleteFrame.Attributes.Add("frameborder", "0");
autoCompleteFrame.Attributes.Add("marginheight", "0");
autoCompleteFrame.Attributes.Add("marginwidth", "2");
autoCompleteFrame.Attributes.Add("scrolling", "auto");
autoCompleteFrame.Attributes.Add("largeur", Largeur.ToString());
autoCompleteFrame.Attributes.Add("hauteur", "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)));
}
remplacement protégé void OnPreRender (EventArgs e)
{
Enregistrer le bloc de script client#region Enregistrer le bloc de script client
si (!Page.ClientScript.IsClientScriptBlockRegistered("__DoAutoComplete"))
{
script de chaîne = chaîne.Concat(
"<langage 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",
" fonction textboxSelect (oTextbox, iStart, iEnd)rn",
" {rn",
" switch(arguments.length) {rn",
"cas 1 :rn",
" oTextbox.select();rn",
" pause;rn",
"rn",
"cas 2 :rn",
" iEnd = oTextbox.value.length;rn",
" /* échoue */rn",
" rn",
" cas 3 : rn",
" si (estIE) {rn",
"var oRange = oTextbox.createTextRange();rn",
" oRange.moveStart("caractère", iStart);rn",
" oRange.moveEnd("character", -oTextbox.value.length + iEnd); rn",
" oRange.select(); rn",
" } sinon si (isMoz){rn",
" oTextbox.setSelectionRange(iStart, iEnd);rn",
" } rn",
" }rn",
"rn",
" oTextbox.focus();rn",
" }rn",
"rn",
" fonction textboxReplaceSelect (oTextbox, sText)rn",
" {rn",
" si (estIE) {rn",
"var oRange = document.selection.createRange();rn",
" oRange.text = sTexte;rn",
" oRange.collapse(true);rn",
" oRange.select(); rn",
" } sinon si (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",
" fonction autocompleteMatch (sText, arrValues)rn",
" {rn",
" var retMatches = ""; rn",
" rn",
" pour (var i=0; i < arrValues.length; i++)rn",
" {rn",
" si (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",
" fonction __DoAutoComplete(oEvent, id)rn",
" {rn",
" var oTextbox = document.getElementById(id + '_textBox');rn",
" var frame = document.getElementById(id + '_autoCompleteFrame');rn",
" var arrValues = document[id + '_data'];rn",
" rn",
" commutateur (oEvent.keyCode) rn",
" {rn",
" cas 38 : //flèche vers le haut rn",
"cas 40 : //flèche vers le basrn",
"cas 37 : //flèche gauchern",
"cas 39 : //flèche droitern",
" cas 33 : //page précédente rn",
" cas 34 : //page suivante rn",
" cas 36 : //home rn",
" cas 35 : //fin rn",
" cas 13 : //entrez rn",
" cas 9 : //onglet rn",
" cas 27 : //esc rn",
" cas 16 : //shift rn",
" cas 17 : //ctrl rn",
" cas 18 : //alt rn",
"cas 20 : //verrouillage des majusculesrn",
" cas 8 : //retour arrière rn",
"cas 46 : //supprimerrn",
" renvoie vrai ;rn",
" pause;rn",
" rn",
"par défaut :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 = 'inline';rn",
" frame.height = '100';rn",
" rn",
" frame.contentWindow.document.body.innerHTML = '';rn",
" pour (var i = 0; i < arrMatches.length; i++)rn",
" {rn",
" frame.contentWindow.document.body.innerHTML += '<div style="largeur : 100%; curseur : par défaut" onmouseover="this.style.backgroundColor=\'#316AC5\' this. style.color=\'blanc\';" onmouseout="this.style.backgroundColor=\'\'; this.style.color=\'noir\';" onclick= "parent.document.getElementById( \'' + id + '_textBox\').value = this.innerHTML">' + arrMatches[i] + '</div>';rn",
" }rn",
" rn",
" frame.contentWindow.document.body.style.backgroundColor = 'blanc';rn",
" frame.contentWindow.document.onclick = function() { document.getElementById(id + '_autoCompleteFrame').style.display = 'none'; };rn",
" } rn",
" } rn",
" rn",
" renvoie faux ;rn",
" } rn",
" }rn",
"</script>rn",
"");
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
}
remplacement protégé void RenderContents (sortie HtmlTextWriter)
{
output.WriteLine(string.Format("<div onmouseleave="document.getElementById('{0}').style.display = 'none';" style="width:{1}" >", MakeUniqueID("autoCompleteFrame"), Largeur));
textBox.RenderControl(sortie);
sortie.WriteLine("<br />");
autoCompleteFrame.RenderControl(sortie);
sortie.WriteLine("</div>");
}
#endregion
}
}
télécharger