可输入下拉框(完美版),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 style=/"POSITION:relative/">");
   output.Write("<span style=/"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;
  }
 }
}

 

建一个webcontrol libery 工程,用上面的代码生成一个dll
然后在使用该控件的工程里面导入dll,之后的事情就和使用textBox等
服务器控件一样了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值