在有些项目中经常会遇到下拉列表框里内容不够的情况下,允许输入,.NET里没有现成的组件,现在我以C#写了一个,希望高手指教
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Collections ;
using System.Collections.Specialized ;
using System.Drawing;

namespace DongLan.ControlLibrary


{

/**//// <summary>
/// Dropdown 可编辑的下拉列表框。
/// 2006-1-4
/// </summary>
///

[DefaultProperty("Items"),
ToolboxData("<{0}:Dropdown runat=server></{0}:Dropdown>")]
public class DropDown : System.Web.UI.WebControls.WebControl

{

内部成员#region 内部成员
private System.Web.UI.WebControls.DropDownList m_oDDList;
private System.Web.UI.WebControls.TextBox m_oTxtList;
#endregion


公开的属性#region 公开的属性

[Bindable(true), Category("Appearance"), DefaultValue("")]
public string Text

{
get

{
EnsureChildControls();
if (m_oTxtList != null)

{
return m_oTxtList.Text;
}
else

{
return null;
}
}
set

{
EnsureChildControls();
m_oTxtList.Text = value;
}
}
[Category("Behavior")]
public bool AutoPostBack

{
get

{
EnsureChildControls();
return m_oDDList.AutoPostBack;
}
set

{
EnsureChildControls();
m_oDDList.AutoPostBack = value;
}
}

[Category("Data")]
public string DataMember

{
get

{
EnsureChildControls();
return m_oDDList.DataMember;
}
set

{
EnsureChildControls();
m_oDDList.DataMember = value;
}
}

[Category("Data"),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),
BindableAttribute(true)]
public object DataSource

{
get

{
EnsureChildControls();
return m_oDDList.DataSource;
}
set

{
EnsureChildControls();
m_oDDList.DataSource = value;
}
}


[Category("Data")]
public string DataTextField

{
get

{
EnsureChildControls();
return m_oDDList.DataTextField;
}
set

{
EnsureChildControls();
m_oDDList.DataTextField = value;
}
}

[Category("Data")]
public string DataTextFormatString

{
get

{
EnsureChildControls();
return m_oDDList.DataTextFormatString;
}
set

{
EnsureChildControls();
m_oDDList.DataTextFormatString = value;
}
}

[Category("Data")]
public string DataValueField

{
get

{
EnsureChildControls();
return m_oDDList.DataValueField;
}
set

{
EnsureChildControls();
m_oDDList.DataValueField = value;
}
}

[Browsable(false)]
public ListItemCollection Items

{
get

{
EnsureChildControls();
return m_oDDList.Items;
}
}

[Browsable(false), Bindable(true)]
public string Value

{
get

{
EnsureChildControls();
return m_oTxtList.Text;
}
set

{
EnsureChildControls();
m_oTxtList.Text = value;
}
}
#endregion


重载#region 重载
public override ControlCollection Controls

{
get

{
EnsureChildControls(); //确认子控件集都已被创建
return base.Controls;
}
}

protected override void CreateChildControls()

{
Controls.Clear();
m_oDDList = new DropDownList();
m_oDDList.EnableViewState = true;
m_oDDList.Style.Add("width","127");
m_oDDList.Style.Add("CLIP","rect(3px 130px 20px 110px)");
m_oDDList.Style.Add("POSITION","absolute");
m_oDDList.SelectedIndexChanged += new EventHandler(m_oDDList_SelectedIndexChanged);
this.Controls.Add(m_oDDList);


m_oTxtList = new System.Web.UI.WebControls.TextBox();
m_oTxtList.AutoPostBack = false;
m_oTxtList.EnableViewState = true;
m_oTxtList.Wrap = true;
m_oTxtList.Style.Add("width","127");
Controls.Add(m_oTxtList);

}

protected override void OnDataBinding(EventArgs e)

{
EnsureChildControls();
m_oDDList.DataBind();
m_oTxtList.DataBind();
base.OnDataBinding (e);
}
#endregion


事件#region 事件
private static readonly object EventSelectedIndexChanged = new object();
public event EventHandler SelectedIndexChanged

{
add

{
Events.AddHandler(EventSelectedIndexChanged, value);
}
remove

{
Events.RemoveHandler(EventSelectedIndexChanged, value);
}
}

#endregion

private void m_oDDList_SelectedIndexChanged(object sender, EventArgs e)

{
this.Text = m_oDDList.SelectedValue.ToString();
this.OnSelectedIndexChanged(e);
}
protected virtual void OnSelectedIndexChanged(EventArgs args)

{
EventHandler onSelectedIndexChanged = (EventHandler)Events[EventSelectedIndexChanged];
if(onSelectedIndexChanged != null)
onSelectedIndexChanged(m_oDDList, args);
}

// protected override void OnPreRender(EventArgs e)
// {
// base.OnPreRender(e);
// }
protected override void Render(HtmlTextWriter output)

{

output.WriteLine("<script language=\"JavaScript\">");
output.WriteLine("function SelectDroup(txtName,DropuName){");
output.WriteLine("txtName.value=DropuName.options(DropuName.selectedIndex).text");
output.WriteLine("}");
output.WriteLine("</script>");
m_oDDList.Attributes.Add("onchange","javascript:SelectDroup("+m_oTxtList.ClientID+",this);");
m_oDDList.RenderControl(output);
m_oTxtList.RenderControl(output);
}

}
}
