由于csdn对评论的字数限制比较吝啬,所以成文于此,描述了对Vazumi实现的autocomplete特性的两点改进。
请参考Vazumi的原文:extaspnet 实现自动完成autocomplete 下拉功能
http://blog.csdn.net/vazumi/archive/2011/05/24/6441639.aspx
测试环境:VS2008+ExtAspNet2.3.2+IE7
改进1、
问题:keyup太灵敏,频繁触发后台事件
解决:将keyup事件当成textchanged事件来使用,代码改动如下
ExtAspNet.PageContext.RegisterStartupScript
(
"var d=Ext.getCmp('" + DropDownList1.ClientID + "');" +
" var oldInput=\"\";" +
" d.listWidth=500; " +
" d.addListener(\"keyup\",function(f,e){ " +
" var newInput=document.getElementById(\"" + DropDownList1.ClientID + "\").value;" +
" if (oldInput==newInput) {return;} " +
" oldInput=newInput;" +
" __doPostBack('loaddata',newInput);" +
"});"
);
改进2、
问题:ddl的数据源在随着关键字的变化没有变化时,客户端会在当前ddl的记录中,过滤出以当前输入的关键字开头的记录,注意是开头,如果是匹配随便哪个位置的话,倒没这个问题的存在了。正因为是开头,所以得到的结果往往并非期望的。
解决:保证每次查询后,ddl的数据源都是不一样的,思路就是给ddl的value添加时间戳,代码改动如下
while (dr.Read())
{
DropDownList1.Items.Add(new ExtAspNet.ListItem(dr["id"].ToString() + "-" + dr["name"].ToString(), dr["id"].ToString() + DateTime.Now.Ticks.ToString()));//给ddl的value加上时间戳
}
补充一张效果图: