原文链接:http://codeproject.com/KB/ajax/AJAXAutoSuggest.aspx 版权归Cassio Alves所有
源码下载
引言
这是我前段时间制作的具有Ajax 自动建议功能的asp.net文本框控件,它基于(Anthem.NET)控件库制作的。
背景
当我们在开发企业级Web项目时候,我们经常需要让用户从一大堆目录列表中选择其中一项,比如:在一个订单窗体上,用户必须能从众多客户中选择一位。出于性能的考虑,加载一个含50000项的DropDownList控件肯定会让人发疯的。还有一种可采取方法就是打开一个新的窗体供用户查找和选择所需客户。以前我曾尝试过这种方式,但是用户常常发现它非常麻烦,迫切需要一个更好的解决办法。
方案
Ajax技术的迅速发展使得这个问题变得非常容易解决。自动建议功能的文本框会完全满足这一要求,用户输入所需客户姓名的一部分内容,该控件会自动调整显示匹配的部分。然而,我还没有发现这样的服务器控件能完全满足我的要求,我需要自动建议的文本框服务器控件具有如下特点:
l
内置有效性验证功能
l
基于模板来提供内容
l
能够绑定各种数据源(集合、数据表等)
l
能有DropDownList控件效果
l
和Anthem.net平滑集成
l
能显示题头
l
无需调用webservices服务
控件
该个性化的控件基于Anthem库创建而成。我决定采用Anthem框架,是因为最近我一直在项目中使用它。Atlas目前还不够成熟,与Anthem相比,后者更容易上手、功能更强大。Anthem库有了官方的AutoSuggest控件,但是我还没有正式使用,如果你还不熟悉Anthem.NET框架,我鼓励你体验一下,它非常简洁但效果很好。它的JavaScriptOO模型基于另一个免费AutoSuggest控件而创建的,你可以访问该站点了解该控件,我发现它非常优雅,但是没有我需要的某些功能。
安装
你只需要在项目中添加Anthem.dll和Anthem.AutoSuggest.dll引用,就可以正常使用了,提供下载的文件包含了DLL、AutoSuggest控件的源代码和示例项目的源代码。
示例代码
你所要做的第一件事就是把该控件添加到aspx页面,可以通过拖拉可视化控件的方式,也可以在aspx源文件中直接写标签代码。我没有添加相关的设计视图支持,就是因为我认为你能够忍耐aspx源码 :)。在该例中,我们使用AutoSuggest控件来显示各种各样的名称,用户从中选择一个他最偏爱的。
2 ID="asbFavoriteBand" DataKeyField="ID"
3 TextBoxDisplayField="Name" AutoCallBack="true"
4 ItemNotFoundMessage="Item not found!" >
5 <itemtemplate>
6 <%# ((Band)Container.DataItem).Name %>
7 </ItemTemplate>
8 </Anthem:AutoSuggestBox>
9
我认为绝大部分属性名的含义都一目了然,建议你熟悉所有属性并熟练使用它们,对那些不熟悉Anthem.NET框架的人来说,AutoCallBack属性表示所选内容发生改变之后,AutoSuggest控件将向服务器触发一次回调,它等同于普通ASP.net控件中的AutoPostBack属性,你还可以象在Repeater,、DataList 、DataGrid中一样使用ItemTemplate。DataKeyField属性表示控件用来设置SelectedValue属性的键字段。
完成第一步之后,开始处理相应事件。最重要的处理事件是TextChanged,它完成建议列表的填充。另一个重要的事件是SelectValueChanged,在你改变当前值的时候触发该事件,为了封装处理这些操作,需要在OnInit方法中完成下面的代码:
2 {
3 base.OnInit(e);
4 this.asbFavoriteBand.TextChanged +=
5 new Anthem.AutoSuggestBox.TextChangedEventHandler(
6 asbFavoriteBand_TextChanged);
7
8 this.asbFavoriteBand.SelectedValueChanged +=
9 new Anthem.AutoSuggestBox.SelectedValueChangedHandler(
10 asbFavoriteBand_SelectedValueChanged);
11 }
12
下面是处理TextChanged事件的代码:
2 Anthem.AutoSuggestEventArgs e)
3 {
4 //Creates a dataview from a datatable
5
6 DataView dv = new DataView(_dtBands);
7
8 //Filters the datatable based on the CurrentText property
9
10 dv.RowFilter = string.Format("BandName LIKE '%{0}%'", e.CurrentText);
11
12 //Sets the dataview as the control's datasource
13
14 asbFavoriteBand.DataSource = dv;
15 asbFavoriteBand.DataBind();
16 }
17
在上面的代码片断中,你可以在AutoSuggest控件中用任一数据源。通常是查询数据库获得结果集,通过调用DataBind方法才能将建议列表显示在屏幕上。
值得关注的地方
无可置疑,这个控件要求我们对.NET控件的工作原理有更进一步的理解,如:使用嵌入式web资源(图像、javascript和css文件),支持基于模板式提供内容,事件触发和处理javascript集成。
面向对象的javascript也值得一看,它的确使处理事情变得更容易。
源码下载