이것은 Teddy가 최근에 캡슐화한 AutoCompleteTextBox입니다. ASP.NET의 자체 TextBox도 특정 자동 완성 기능을 지원하지만 이는 브라우저 구현에 의존하며 사용자 지정 자동 완성 후보를 지정할 수 없다는 것을 알고 있습니다. 이 문서에 나열된 AutoCompleteTextBox는 이러한 단점을 보완합니다. AutoCompleteTextBox.AutoCompleteData 속성을 설정하고 string[]을 전달하여 TextBox가 사용자 지정 후보를 지원하도록 만드세요.
현재 입력과 일치하는 후보가 없으면자동 완성 논리는
일반 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
{
비공개 회원#region 비공개 회원
비공개 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(문자열의 문자열 str)
{
sb.Append(string.Format("'{0}', ", str.Replace("'", " \' ")));
}
return sb.ToString().TrimEnd(',', ' ') + ");";
}
또 다른
{
"새 배열;"을 반환합니다.
}
}
비공개 문자열 MakeUniqueID(문자열 ID)
{
if (id != null && id.Trim().Length > 0)
{
return string.Concat(this.UniqueID.Replace("$", "_"), "_", id);
}
또 다른
{
return this.UniqueID.Replace("$", "_");
}
}
#endregion
속성#region 속성
[바인딩 가능(true)]
[카테고리("외관")]
[기본값("")]
[현지화 가능(true)]
공개 문자열 텍스트
{
얻다
{
if(Page.IsPostBack)
{
textBox.Text = Page.Request.Form[MakeUniqueID("textBox")];
}
textBox.Text를 반환합니다.
}
세트
{
textBox.Text = 값;
}
}
[바인딩 가능(true)]
[카테고리("행동")]
[기본값("")]
[현지화 가능(true)]
공개 정수 MaxLength
{
얻다
{
textBox.MaxLength를 반환합니다.
}
세트
{
textBox.MaxLength = 값;
}
}
[바인딩 가능(true)]
[카테고리("행동")]
[기본값(거짓)]
[현지화 가능(true)]
공개 bool 읽기 전용
{
얻다
{
textBox.ReadOnly를 반환합니다.
}
세트
{
textBox.ReadOnly = 값;
}
}
공개 문자열[] AutoCompleteData
{
얻다
{
string[] s = (string[])ViewState["AutoCompleteData"];
return ((s == null) ? null : s);
}
세트
{
ViewState["AutoCompleteData"] = 값;
}
}
#endregion
재정의 멤버#region 재정의 멤버
보호 재정의 void CreateChildControls()
{
create textBox#region create 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
autoCompleteFrame 만들기#region autoCompleteFrame 만들기
autoCompleteFrame.TagName = "iframe";
autoCompleteFrame.ID = MakeUniqueID("autoCompleteFrame");
autoCompleteFrame.Attributes.Add("style", "display:none; 위치: 절대; 테두리: 능선 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.ToString());
autoCompleteFrame.Attributes.Add("height", "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(
"<스크립트 언어="javascript" 유형="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",
" 함수 textboxSelect (oTextbox, iStart, iEnd)rn",
" {rn",
" 스위치(arguments.length) {rn",
"사례 1:rn",
" oTextbox.select();rn",
" 휴식;rn",
"rn",
"사례 2:rn",
" iEnd = oTextbox.value.length;rn",
" /*는 */rn을 통과합니다.",
" rn",
" 사례 3: rn",
" if (isIE) {rn",
"var oRange = oTextbox.createTextRange();rn",
" oRange.moveStart("character", iStart);rn",
" oRange.moveEnd("문자", -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",
" 함수 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",
" 함수 autocompleteMatch(sText, arrValues)rn",
" {rn",
" var retMatches = ""; rn",
" rn",
" (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",
" retMatches를 반환합니다.rn",
" }rn",
"rn",
" 함수 __DoAutoComplete(oEvent, id)rn",
" {rn",
" var oTextbox = document.getElementById(id + '_textBox');rn",
" var 프레임 = document.getElementById(id + '_autoCompleteFrame');rn",
" var arrValues = document[id + '_data'];rn",
" 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",
" true를 반환합니다.rn",
" 휴식;rn",
" rn",
"기본값: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",
" 프레임.스타일.디스플레이 = '인라인';rn",
" 프레임.높이 = '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="너비: 100%; 커서: 기본값" onmouseover="this.style.BackgroundColor=\'#316AC5\'; style.color=\'흰색\';" onmouseout="this.style.BackgroundColor=\'\'; this.style.color=\'검은색\';" onclick= "parent.document.getElementById( \'' + id + '_textBox\').value = this.innerHTML">' + arrMatches[i] + '</div>';rn",
" }rn",
" rn",
" 프레임.contentWindow.document.body.style.BackgroundColor = '흰색';rn",
"frame.contentWindow.document.onclick = function() { document.getElementById(id + '_autoCompleteFrame').style.display = 'none'; };rn",
" } rn",
" } rn",
" rn",
" 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 언어="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(출력);
출력.WriteLine("<br />");
autoCompleteFrame.RenderControl(출력);
출력.WriteLine("</div>");
}
#끝지역
}
}
다운로드