原 来做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 | 最小前缀的长度大小 | 当输入长度达到最小的时候,便提供智能选择 |
按照上篇文章介绍,创建一个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
>
![None.gif](/Images/OutliningIndicators/None.gif)
2
![None.gif](/Images/OutliningIndicators/None.gif)
3
![None.gif](/Images/OutliningIndicators/None.gif)
4
![None.gif](/Images/OutliningIndicators/None.gif)
5
![None.gif](/Images/OutliningIndicators/None.gif)
6
![None.gif](/Images/OutliningIndicators/None.gif)
7
![None.gif](/Images/OutliningIndicators/None.gif)
8
![None.gif](/Images/OutliningIndicators/None.gif)
9
![None.gif](/Images/OutliningIndicators/None.gif)
10
![None.gif](/Images/OutliningIndicators/None.gif)
下面是处理智能选择的网络服务:
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![None.gif](/Images/OutliningIndicators/None.gif)
8![None.gif](/Images/OutliningIndicators/None.gif)
9![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**/
/// <summary>
10
/// WebService 的摘要说明
11
/// </summary>
12
[WebService(Namespace
=
"
http://tempuri.org/
"
)]
13
[WebServiceBinding(ConformsTo
=
WsiProfiles.BasicProfile1_1)]
14![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public
class
WebService : System.Web.Services.WebService
{
15![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
16![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public WebService ()
{
17![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
18
//如果使用设计的组件,请取消注释以下行
19
//InitializeComponent();
20
}
21
public string[] AutoCompleteWordList = null;
22
[WebMethod]
23
public string[] GetWordList(string prefixText, int count)
24![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
25
if (AutoCompleteWordList == null)
26![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
34
index=~index;
35
}
36
int matchedCount = 0;
37
for (matchedCount = 0; matchedCount < count&&matchedCount+index<AutoCompleteWordList.Length; matchedCount++)
38![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
39
if (!AutoCompleteWordList[matchedCount + index].StartsWith(prefixText,StringComparison.CurrentCultureIgnoreCase))
40![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
41
break;
42
}
43
}
44
string[] returnValue = new string[matchedCount];
45
if (matchedCount > 0)
46![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
47
Array.Copy(AutoCompleteWordList,index, returnValue,0, matchedCount);
48
}
49
return returnValue;
50
}
51![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
52
}
53![None.gif](/Images/OutliningIndicators/None.gif)
54
如果在app_data中的txt文件wors.txt。
![None.gif](/Images/OutliningIndicators/None.gif)
2
![None.gif](/Images/OutliningIndicators/None.gif)
3
![None.gif](/Images/OutliningIndicators/None.gif)
4
![None.gif](/Images/OutliningIndicators/None.gif)
5
![None.gif](/Images/OutliningIndicators/None.gif)
6
![None.gif](/Images/OutliningIndicators/None.gif)
7
![None.gif](/Images/OutliningIndicators/None.gif)
8
![None.gif](/Images/OutliningIndicators/None.gif)
9
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
10
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
11
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
12
![None.gif](/Images/OutliningIndicators/None.gif)
13
![None.gif](/Images/OutliningIndicators/None.gif)
14
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](/Images/OutliningIndicators/ContractedBlock.gif)
![dot.gif](/Images/dot.gif)
15
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
16
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
17
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
18
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
19
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
20
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
21
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
22
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
23
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
24
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
25
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
26
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
27
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
28
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
29
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
30
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
31
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
32
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
33
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
34
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
35
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
36
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
37
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
38
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
39
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
40
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
41
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
42
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
43
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
44
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
45
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
46
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![ContractedSubBlock.gif](/Images/OutliningIndicators/ContractedSubBlock.gif)
![dot.gif](/Images/dot.gif)
47
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
48
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
49
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
50
![ExpandedSubBlockEnd.gif](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
51
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
52
![ExpandedBlockEnd.gif](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
53
![None.gif](/Images/OutliningIndicators/None.gif)
54
![None.gif](/Images/OutliningIndicators/None.gif)
此时,运行效果如下:
这 个控件虽然好用易用,但是我思考却不应该滥用。比如在一个很多人并发填写表单的时候,这样每写几个字就调用一下Web Services,每次取回来的东西也不会太大,这对于网络服务来说,连接占用的时间过多,这严重偏离了网络服务大块头设计的原则。因此应用也要看下环 境。
上一篇: atlas学习系列一(简单体验)