可输入下拉框,完美版,asp.net

最近很是郁闷,一个可输入的下拉框搞了我好几天,开始的时候在网上找到一个服务器控件,用了一下,发现满足不了自己的需求。于是乎花了几个小时改了改,终于成形。这个控件和别人不同有以下两点:

1,一般的dropdownlist都会默认选中第一条,这样的话,在选择第一条的时候就没有事件,而往往这时候我们需要触发ongchange事件,于是我在它的foucus事件中强行改变它的selectedIndex。

2,输入的内容如果和下拉框中的某项相同时,会自动选中下拉框中那一条。

using System;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.ComponentModel;

using System.Collections;

namespace ExtendWebControls

{

[ToolboxData("<{0}:DropDownListExtend runat=\"server\" />")]

public class DropDownListExtend : System.Web.UI.WebControls.TextBox

{

private Hashtable _values;

private DropDownList _DropDownList;

public DropDownListExtend()

{

_values = new Hashtable();

_DropDownList = new DropDownList();

}

public Hashtable Values

{

get{return _values;}

set{_values = value;}

}

protected override void Render(HtmlTextWriter output)

{

int iWidth = Convert.ToInt32(base.Width.Value);

if(iWidth == 0)

{

iWidth = 102;

base.Width = Unit.Parse("102px");

}

int sWidth = iWidth + 16;

int spanWidth = sWidth - 18;

output.Write("<div POSITION:relative\">");

output.Write("<span MARGIN-LEFT:" + spanWidth.ToString() + "px;OVERFLOW:hidden;WIDTH:18px\">");

_DropDownList.Width = Unit.Parse(sWidth.ToString() + "px");

_DropDownList.Style.Add("MARGIN-LEFT", "-" + spanWidth.ToString() + "px");

_DropDownList.ID = base.ID + "_Select";

_DropDownList.Attributes.Add("onchange", "this.parentNode.nextSibling.value=this.value");

_DropDownList.Attributes.Add("onfocus", ""+this.getFocusScript()+"");

if(_values.Count > 0)

{

foreach(string key in _values.Keys)

{

ListItem item = new ListItem();

item.Value = key;

item.Text = _values[key].ToString();

_DropDownList.Items.Add(item);

}

}

_DropDownList.RenderControl(output);

output.Write("</span>");

base.Style.Clear();

base.Width = Unit.Parse(iWidth.ToString() + "px");

base.Style.Add("left", "0px");

base.Style.Add("POSITION", "absolute");

base.Render(output);

output.Write("</div>");

}

private string getFocusScript()

{

string strScript = "\n";

strScript += "var isExist = -2;\n";

strScript += "var obj = event.srcElement;\n";

strScript += "var str = this.parentNode.nextSibling.value;\n";

strScript += "var ary = obj.options;\n";

strScript += "for(var i=0;i<ary.length;i++){\n";

strScript += " if(str == ary[i].text){\n";

strScript += " isExist = i;\n";

strScript += " break;\n";

strScript += " }\n";

strScript += "}\n";

strScript += "if(isExist != -2){\n";

strScript += " obj.selectedIndex = isExist;\n";

strScript += "}\n";

strScript += "else{\n";

strScript += " obj.selectedIndex = -1;\n";

strScript += "}\n";

return strScript;

}

}

}