Dies ist eine AutoCompleteTextBox, die Teddy kürzlich gekapselt hat. Wir wissen, dass die eigene TextBox von ASP.NET auch bestimmte AutoComplete-Funktionen unterstützt, diese jedoch auf der Browserimplementierung basiert und keine benutzerdefinierten AutoComplete-Kandidaten angeben kann. Die in diesem Artikel aufgeführte AutoCompleteTextBox gleicht dieses Manko aus. Legen Sie einfach die Eigenschaft AutoCompleteTextBox.AutoCompleteData fest und übergeben Sie einen String[], damit die TextBox benutzerdefinierte Kandidaten unterstützt.
Wenn es keinen Kandidaten gibt, der mit der aktuellen Eingabe übereinstimmt, istdie AutoComplete-Logik
dieselbe wie bei einer normalen TextBox.
Wenn nur ein Kandidat mit der aktuellen Eingabe übereinstimmt, wird diese automatisch vervollständigt;
Wenn mehr als ein Kandidat mit der aktuellen Eingabe übereinstimmt, wird der erste Kandidat automatisch im Textfeld vervollständigt und ein Popup-Fenster mit allen Kandidaten wird angezeigt.
Implementierungsquellcode
wird in VS2005 kompiliert, tatsächlich wird jedoch fast keine Syntax verwendet, die auf 2.0 basiert, und er kann mit minimalen Änderungen unter vs2003 kompiliert werden.
Verwenden des Systems;
mit System.Collections.Generic;
mit System.ComponentModel;
Verwenden von System.Text;
mit System.Web;
mit System.Web.UI;
mit System.Web.UI.WebControls;
unter Verwendung von System.Web.UI.HtmlControls;
Namespace Ilungasoft.Framework.Web.UI.WebControls
{
[ToolboxData("<{0}:AutoCompleteTextBox runat=server></{0}:AutoCompleteTextBox>")]
öffentliche Klasse AutoCompleteTextBox: WebControl
{
Private Mitglieder#region Private Mitglieder
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(',', ' ') + ");";
}
anders
{
return „new Array;“;
}
}
privater String MakeUniqueID(String-ID)
{
if (id != null && id.Trim().Length > 0)
{
return string.Concat(this.UniqueID.Replace("$", "_"), "_", id);
}
anders
{
return this.UniqueID.Replace("$", "_");
}
}
#endregion
Properties#region Properties
[Bindable(true)]
[Kategorie("Aussehen")]
[Standardwert("")]
[Lokalisierbar(wahr)]
öffentlicher String-Text
{
erhalten
{
if (Page.IsPostBack)
{
textBox.Text = Page.Request.Form[MakeUniqueID("textBox")];
}
return textBox.Text;
}
Satz
{
textBox.Text = value;
}
}
[Bindbar(wahr)]
[Kategorie("Verhalten")]
[Standardwert("")]
[Lokalisierbar(wahr)]
public int MaxLength
{
erhalten
{
return textBox.MaxLength;
}
Satz
{
textBox.MaxLength = value;
}
}
[Bindbar(wahr)]
[Kategorie("Verhalten")]
[DefaultValue(false)]
[Lokalisierbar(wahr)]
öffentlicher Bool ReadOnly
{
erhalten
{
return textBox.ReadOnly;
}
Satz
{
textBox.ReadOnly = value;
}
}
public string[] AutoCompleteData
{
erhalten
{
string[] s = (string[])ViewState["AutoCompleteData"];
return ((s == null) ? null : s);
}
Satz
{
ViewState["AutoCompleteData"] = value;
}
}
#endregion
Overriden Members#region Overriden Members
protected override void CreateChildControls()
{
textBox erstellen#region textBox erstellen
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 = Breite;
#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)));
"
onmouseout", string.Format("document.show_{0} = false;", MakeUniqueID(null)));
}
protected override void OnPreRender(EventArgs e)
{
Client-Skriptblock registrieren#region Client-Skriptblock registrieren,
wenn (!Page.ClientScript.IsClientScriptBlockRegistered("__DoAutoComplete"))
{
string script = 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",
„rn“,
" Funktion textboxSelect (oTextbox, iStart, iEnd)rn",
„ {rn“,
" switch(arguments.length) {rn",
„Fall 1:rn“,
" oTextbox.select();rn",
" Pause;rn",
„rn“,
„Fall 2:rn“,
" iEnd = oTextbox.value.length;rn",
" /* fällt durch */rn",
" rn",
" Fall 3: rn",
" if (isIE) {rn",
"var oRange = oTextbox.createTextRange();rn",
" oRange.moveStart("character", iStart);rn",
" oRange.moveEnd("character", -oTextbox.value.length + iEnd); rn",
" oRange.select(); rn",
" } else if (isMoz){rn",
" oTextbox.setSelectionRange(iStart, iEnd);rn",
" } rn",
" }rn",
„rn“,
" oTextbox.focus();rn",
" }rn",
„rn“,
" Funktion textboxReplaceSelect (oTextbox, sText)rn",
„ {rn“,
" if (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",
„rn“,
" oTextbox.focus();rn",
" }rn",
„rn“,
„Funktion 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",
" if (retMatches.length > 0)rn",
„ {rn“,
" retMatches = retMatches.substr(0, retMatches.length - 1);rn",
" } rn",
„rn“,
" return retMatches;rn",
" }rn",
„rn“,
„ Funktion __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",
" switch (oEvent.keyCode) rn",
„ {rn“,
" Fall 38: //Pfeil nach oben rn",
„Fall 40: //Pfeil nach untenrn“,
"Fall 37: //Pfeil nach linksrn",
„Fall 39: //Rechtspfeilrn“,
" Fall 33: //Seite nach oben rn",
" Fall 34: //Seite nach unten rn",
" Fall 36: //home rn",
" case 35: //end rn",
" Fall 13: //rn eingeben",
" Fall 9: //tab rn",
" Fall 27: //esc rn",
" Fall 16: //shift rn",
" Fall 17: //Strg rn",
" Fall 18: //alt rn",
"Fall 20: //Feststelltastern",
" Fall 8: //Rücktaste rn",
"Fall 46: //löschenrn",
" return true;rn",
" Pause;rn",
" rn",
"Standard: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“,
" if (sMatches.length > 0)rn",
„ {rn“,
"var arrMatches = sMatches.split(',');rn",
" oTextbox.value = arrMatches[0];rn",
" textboxSelect(oTextbox, iLen, oTextbox.value.length);rn",
" rn",
" if (arrMatches.length > 1)rn",
„ {rn“,
" frame.style.display = 'inline';rn",
" frame.height = '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="width: 100%; Cursor: 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",
" 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",
„ return false;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
}
protected override void RenderContents(HtmlTextWriter-Ausgabe)
{
Output.WriteLine(string.Format("<div onmouseleave="document.getElementById('{0}').style.display = 'none';" style="width:{1}" >", MakeUniqueID("autoCompleteFrame"), Breite));
textBox.RenderControl(output);
Ausgabe.WriteLine("<br />");
autoCompleteFrame.RenderControl(output);
Ausgabe.WriteLine("</div>");
}
#endregion
}
}
herunterladen