原来做asp.net的时候,有些表单是带有参照类型的,比如城市的省份城市的录入,或者员工姓名的录入,以前的做法是走了两个极端,一种是用户在 TextBox中输入,另一种是在DropDownList中进行选择。第一种用户需要记住录入的全部内容,输入效率才高,第二种无需提前知道录入内容,但是当供选择的记录过多的时候,选择起来也比较麻烦。那么一种智能式选择是一种折中的做法,我们原来是设置字典参照,然后在字典中选择。现在有了 Atlas,这种事情实现起来就简单多了。atlas的AutoCompleteProperties就可以满足这方面的要求。它可以通过设置 TargetControlID来控制某个控件,并且需要提供一个Web Services的路径和Web Services的方法。
AutoCompleteProperties的属性包括
属性名称 |
属性描述 |
备注 |
TargetControlID |
指定要控制的控件的ID |
一般为TextBox的ID |
ServicePath |
处理智能选择列表的Web Services路径 |
? |
ServiceMethod |
处理智能选择列表的网络服务服务 |
该方法一般包含两个参数(string prefixText,int count) |
Enabled |
是否可用 |
? |
MinimumPrefixLength |
最小前缀的长度大小 |
当输入长度达到最小的时候,便提供智能选择 |
下面是一个Demo:
按照上篇文章介绍,创建一个Atlas网站,然后再一个页面中添加如下代码:
?1

<
div
>
?2

????
<
asp:Panel?
ID
="Panel1"
?runat
="server"
?Height
="125px"
?Width
="125px"
>
?3

????
</
asp:Panel
>
?4

????
<
asp:TextBox?
ID
="TextBox1"
?runat
="server"
></
asp:TextBox
><
asp:DropDownList?
ID
="DropDownList2"
?5

????????runat
="server"
>
?6

????
</
asp:DropDownList
>
?7

????
<
atlas:AutoCompleteExtender?
ID
="AutoCompleteExetender1"
?runat
="server"
??DropDownPanelID
="Panel1"
>
?8

????
<
atlas:AutoCompleteProperties??
TargetControlID
="TextBox1"
?Enabled
="true"
?ServicePath
="WebService.asmx"
?ServiceMethod
="GetWordList"
??MinimumPrefixLength
="1"
?
/>
?9

????
</
atlas:AutoCompleteExtender
>
10

????
</
div
>
下面是处理智能选择的网络服务:
?1

using
?System;
?2

using
?System.Web;
?3

using
?System.Collections;
?4

using
?System.Web.Services;
?5

using
?System.Web.Services.Protocols;
?6

using
?System.IO;
?7

?8

?9


/**/
///?<summary>
10
///?WebService?的摘要说明
11
///?</summary>
12

[WebService(Namespace?
=
?
"
http://tempuri.org/
"
)]
13

[WebServiceBinding(ConformsTo?
=
?WsiProfiles.BasicProfile1_1)]
14


public
?
class
?WebService?:?System.Web.Services.WebService?

{
15
16

????public?WebService?()?
{
17
18
????????//如果使用设计的组件,请取消注释以下行?
19
????????//InitializeComponent();?
20
????}
21
????public??string[]?AutoCompleteWordList?=?null;
22
????[WebMethod]
23
????public?string[]?GetWordList(string?prefixText,?int?count)
24

????
{
25
????????if?(AutoCompleteWordList?==?null)
26

????????
{
27
????????????string[]?tempList?=?File.ReadAllLines(Server.MapPath("~/App_Data/Words.txt"),System.Text.Encoding.Default);
28
????????????Array.Sort(tempList,?new?CaseInsensitiveComparer());
29
????????????AutoCompleteWordList?=?tempList;
30
????????}
31
????????int?index?=?Array.BinarySearch(AutoCompleteWordList,prefixText,new?CaseInsensitiveComparer());
32
????????if(index<0)
33

????????
{
34
????????????index=~index;
35
????????}
36
????????int?matchedCount?=?0;
37
????????for?(matchedCount?=?0;?matchedCount?<?count&&matchedCount+index<AutoCompleteWordList.Length;?matchedCount++)
38

????????
{
39
????????????if?(!AutoCompleteWordList[matchedCount?+?index].StartsWith(prefixText,StringComparison.CurrentCultureIgnoreCase))
40

????????????
{
41
????????????????break;
42
????????????}
43
????????}
44
????????string[]?returnValue?=?new?string[matchedCount];
45
????????if?(matchedCount?>?0)
46

????????
{
47
????????????Array.Copy(AutoCompleteWordList,index,?returnValue,0,?matchedCount);
48
????????}
49
????????return?returnValue;
50
????}
51
52
}
53

54

如果在app_data中的txt文件wors.txt。 此时,运行效果如下: 这个控件虽然好用易用,但是我思考却不应该滥用。比如在一个很多人并发填写表单的时候,这样每写几个字就调用一下Web Services,每次取回来的东西也不会太大,这对于网络服务来说,连接占用的时间过多,这严重偏离了网络服务大块头设计的原则。因此应用也要看下环境。?