Ini adalah AutoCompleteTextBox yang baru-baru ini dienkapsulasi oleh Teddy. Kita tahu bahwa TextBox milik ASP.NET juga mendukung fungsi AutoComplete tertentu, namun bergantung pada implementasi browser dan tidak dapat menentukan kandidat AutoComplete khusus. AutoCompleteTextBox yang tercantum dalam artikel ini menutupi kekurangan ini. Cukup atur properti AutoCompleteTextBox.AutoCompleteData dan berikan string[] untuk membuat TextBox mendukung kandidat khusus.
Jika tidak ada kandidat yang cocok dengan input saat ini,logika AutoComplete
akan sama dengan TextBox normal;
Jika hanya satu kandidat yang cocok dengan masukan saat ini, maka secara otomatis selesai;
Jika lebih dari satu kandidat cocok dengan masukan saat ini, kandidat pertama secara otomatis diisi dalam kotak teks dan kotak popup yang berisi semua kandidat akan muncul.
sumber implementasi
dikompilasi di VS2005, namun kenyataannya, hampir tidak ada sintaks yang bergantung pada 2.0 yang digunakan, dan dapat dikompilasi di bawah vs2003 dengan sedikit modifikasi.
menggunakan Sistem;
menggunakan System.Collections.Generik;
menggunakan Sistem.ComponentModel;
menggunakan Sistem.Teks;
menggunakan Sistem.Web;
menggunakan Sistem.Web.UI;
menggunakan Sistem.Web.UI.WebControls;
menggunakan System.Web.UI.HtmlControls;
namespace Ilungasoft.Framework.Web.UI.WebControls
{
[ToolboxData("<{0}:AutoCompleteTextBox runat=server></{0}:AutoCompleteTextBox>")]
AutoCompleteTextBox kelas publik : WebControl
{
Anggota Pribadi#wilayah Anggota Pribadi
Kotak Teks pribadi textBox = new TextBox();
pribadi HtmlGenericControl autoCompleteFrame = HtmlGenericControl();
string pribadi ToJsStringArray(params string[] strs)
{
if (strs != null && strs.Panjang > 0)
{
StringBuilder sb = StringBuilder baru();
sb.Append(" new Array(");
foreach (string str dalam strs)
{
sb.Append(string.Format("'{0}', ", str.Replace("'", " \' ")));
}
kembalikan sb.ToString().TrimEnd(',', ' ') + ");";
}
kalau tidak
{
kembalikan "Array baru;";
}
}
string pribadi MakeUniqueID(string id)
{
if (id != null && id.Trim().Panjang > 0)
{
return string.Concat(ini.UniqueID.Replace("$", "_"), "_", id);
}
kalau tidak
{
kembalikan ini.UniqueID.Replace("$", "_");
}
}
endregion
#Properti wilayah
[Dapat Diikat(benar)]
[Kategori("Penampilan")]
[Nilai Default("")]
[Dapat dilokalisasi (benar)]
Teks string publik
{
mendapatkan
{
jika (Halaman.IsPostBack)
{
textBox.Text = Halaman.Permintaan.Form[MakeUniqueID("textBox")];
}
kembalikan textBox.Text;
}
mengatur
{
textBox.Teks = nilai;
}
}
[Dapat diikat(benar)]
[Kategori("Perilaku")]
[Nilai Default("")]
[Dapat dilokalisasi (benar)]
publik ke MaxLength
{
mendapatkan
{
kembalikan textBox.MaxLength;
}
mengatur
{
textBox.MaxLength = nilai;
}
}
[Dapat diikat(benar)]
[Kategori("Perilaku")]
[Nilai Default (salah)]
[Dapat dilokalisasi (benar)]
boo publik ReadOnly
{
mendapatkan
{
kembalikan textBox.ReadOnly;
}
mengatur
{
textBox.ReadOnly = nilai;
}
}
string publik[]Data LengkapOtomatis
{
mendapatkan
{
string[] s = (string[])ViewState["AutoCompleteData"];
kembali ((s == null) ? null : s);
}
mengatur
{
ViewState["AutoCompleteData"] = nilai;
}
}
#endregion
Overriden Members#region Overriden Members
dilindungi override void CreateChildControls()
{
buat textBox#region buat 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 = Lebar;
#endregion
buat autoCompleteFrame#region buat 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("lebar", Lebar.ToString());
autoCompleteFrame.Attributes.Add("tinggi", "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
}
penggantian yang dilindungi batal OnPreRender(EventArgs e)
{
Daftarkan Blok Skrip Klien#region Daftarkan Blok Skrip Klien
jika (!Page.ClientScript.IsClientScriptBlockRegistered("__DoAutoComplete"))
{
skrip string = string.Concat(
"<bahasa skrip="javascript" type="teks/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",
" fungsi kotak teksPilih (oTextbox, iStart, iEnd)rn",
" {rn",
" switch(argumen.panjang) {rn",
"kasus 1:rn",
" oTextbox.pilih();rn",
" istirahat;rn",
"rn",
"kasus 2:rn",
" iEnd = oTextbox.nilai.panjang;rn",
" /* gagal */rn",
" rn",
"kasus 3: rn",
" jika (isIE) {rn",
"var oRange = oTextbox.createTextRange();rn",
" oRange.moveStart("karakter", iStart);rn",
" oRange.moveEnd("karakter", -oTextbox.value.length + iEnd); rn",
" oRange.pilih(); rn",
" } lain jika (isMoz){rn",
" oTextbox.setSelectionRange(iStart, iEnd);rn",
" } rn",
" }rn",
"rn",
" oTextbox.fokus();rn",
" }rn",
"rn",
" fungsi kotak teksReplaceSelect (oTextbox, sText)rn",
" {rn",
" jika (isIE) {rn",
"var oRange = dokumen.selection.createRange();rn",
" oRange.teks = sTeks;rn",
" oRange.collapse(benar);rn",
" oRange.pilih(); rn",
" } lain jika (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.fokus();rn",
" }rn",
"rn",
" fungsi autocompleteMatch (sText, arrValues)rn",
" {rn",
" var retMatches = ""; rn",
"rn",
" untuk (var i=0; i < arrValues.length; i++)rn",
" {rn",
" jika (arrValues[i].indexOf(sText) == 0)rn",
" {rn",
" retMatches += arrValues[i] + ',';rn",
" }rn",
" }rn",
"rn",
" jika (retMatches.length > 0)rn",
" {rn",
" retMatches = retMatches.substr(0, retMatches.length - 1);rn",
" } rn",
"rn",
" kembalikan Pertandingan Ulang;rn",
" }rn",
"rn",
" fungsi __DoAutoComplete(oEvent, id)rn",
" {rn",
" var oTextbox = dokumen.getElementById(id + '_textBox');rn",
" var frame = dokumen.getElementById(id + '_autoCompleteFrame');rn",
" var arrValues = dokumen[id + '_data'];rn",
"rn",
" saklar (oEvent.keyCode) rn",
" {rn",
" kasus 38: //panah atas rn",
"kasus 40: //panah bawahrn",
"kasus 37: //panah kirirn",
"kasus 39: //panah kananrn",
" kasus 33: //halaman naik rn",
" kasus 34: //halaman ke bawah rn",
" kasus 36: //rumah rn",
" kasus 35: //akhir rn",
" kasus 13: //masukkan rn",
" kasus 9: //tab rn",
" kasus 27: //esc rn",
" kasus 16: //shift rn",
" kasus 17: //ctrl rn",
" kasus 18: //alt rn",
"kasus 20: //caps lockrn",
" kasus 8: //spasi mundur rn",
"kasus 46: //hapusrn",
" kembalikan benar;rn",
" istirahat;rn",
" rn",
"standar:rn",
" textboxReplaceSelect(oTextbox, String.fromCharCode(isIE ? oEvent.keyCode : oEvent.charCode));rn",
" var iLen = oTextbox.nilai.panjang;rn",
"rn",
" var sMatches = autocompleteMatch(oTextbox.value, arrValues);rn",
"rn",
" jika (sMatches.length > 0)rn",
" {rn",
"var arrMatches = sMatches.split(',');rn",
" oTextbox.nilai = arrMatches[0];rn",
"textboxSelect(oTextbox, iLen, oTextbox.nilai.panjang);rn",
" rn",
" jika (arrMatches.length > 1)rn",
" {rn",
" frame.style.display = 'sebaris';rn",
"bingkai.tinggi = '100';rn",
"rn",
" frame.contentWindow.document.body.innerHTML = '';rn",
"untuk (var i = 0; i < arrMatches.length; i++)rn",
" {rn",
" frame.contentWindow.document.body.innerHTML += '<div style="lebar: 100%; kursor: default" onmouseover="this.style.backgroundColor=\'#316AC5\'; style.color=\'putih\';" onmouseout="ini.gaya.backgroundColor=\'\'; ini.style.color=\'hitam\';" onclick= "parent.document.getElementById( \'' + id + '_textBox\').value = this.innerHTML">' + arrMatches[i] + '</div>';rn",
" }rn",
" rn",
" frame.contentWindow.document.body.style.backgroundColor = 'putih';rn",
" frame.contentWindow.document.onclick = function() { document.getElementById(id + '_autoCompleteFrame').style.display = 'none'; };rn",
" } rn",
" } rn",
" rn",
" kembalikan salah;rn",
" } rn",
" }rn",
"</skrip>rn",
"");
Halaman.ClientScript.RegisterClientScriptBlock(typeof(string), "__DoAutoComplete", skrip);
}
if (!Page.ClientScript.IsClientScriptBlockRegistered(MakeUniqueID("data")))
{
Halaman.ClientScript.RegisterClientScriptBlock(typeof(string), MakeUniqueID("data"), string.Format("<script bahasa="javascript" type="text/javascript">dokumen.{0}_data = { 1}</script>", MakeUniqueID(null), ToJsStringArray(AutoCompleteData)));
}
#wilayah akhir
}
penggantian yang dilindungi void RenderContents (keluaran HtmlTextWriter)
{
output.WriteLine(string.Format("<div onmouseleave="document.getElementById('{0}').style.display = 'none';" style="width:{1}" >", MakeUniqueID("autoCompleteFrame"), Lebar));
Kotak teks.RenderControl(keluaran);
keluaran.WriteLine("<br />");
autoCompleteFrame.RenderControl(keluaran);
keluaran.WriteLine("</div>");
}
#wilayah akhir
}
}
unduh