1.“客户”和“经销商”均采用了可编辑的下拉(EditableDropTreelist).
2.“客户”是普通的可编辑下拉,具有客户端搜索功能,请在某行“客户”处慢慢输入"London",看看搜索效果;
3.“经销商”的下拉树列表的 dataURL 采用了表达式,使之具备了服务器端搜索功能,每输入一个字都能从服务器获得刷新. 请在“经销商”处慢慢输入 "London", 看看有什么不同 ( 注: 此处反应比较迟钝,是因为我们将最小刷新间隔 RefreshDelay 设成600毫秒,在您自己的应用中,可以将它设得小一点).
4.请在“经销商”处快速输入 "well" 后立即回车,查看单元格数据的变化;快速输入 "we" 后立即回车,却未能获取数据,请您自己分析原因.




1.源码分析:可查看创建该TreeList的XML描述文件
2.查看被下拉引用的客户
3.查看被下拉引用的经销商,关注dataURL,它采用了表达式:
  dataURL="='http://www.supcan.cn/dotnet/customer.aspx?substr='+encodeURIComponent(data)"
  备注:encodeURIComponent( ) 函数作用是对汉字和某些字符作UTF-8编码.
4.查看提供“经销商”搜索功能的服务器端的C#源码
5.注意:服务器端的这个服务,还必须承担对单个Key(不是输入的文字)的搜索服务,请看OnReady( )事件:
function OnReady(id)
{
 AF.func("Build", "treelist/orders3.xml");
 AF.func("Load", "treelistdata/orders.txt");
 
 //模拟初始加载:经销商(服务器搜索列)的某几行数据
 //注意:设置的是data(外键),而不是display text
 AF.func("SetCellData", "8 \r\n CustomerID2 \r\nWELLI");		//WELLI 是dataCol数据, 而不是displayCol
 AF.func("SetCellData", "9 \r\n CustomerID2 \r\nHILAA");		//HILAA 是dataCol数据, 而不是displayCol
}
  源码的第8、9行模拟了这种场景,如果Load( )的数据包含了 经销商 的数据,在显示时,硕正控件是逐行向服务器发送http请求,取得key相应的display内容的!

6.性能优化:TextId技术简介
  从上述分析可知,采用服务器搜索时,初始数据肯定会导致性能问题: 如果每行都有初始值,那么每一行在初次显示时都会向服务器发起一个请求。为了解决此性能问题,建议使用 textId 技术:增加一个隐藏列,该列保存了初始数据的显示内容,由服务器生成加载数据时同时生成。如下是使用了 textId 的例子:
  请查看该TreeList的XML描述文件, 核心是:
...
<Col name="CustomerID2" textId="CustomerValue" edittype="editableDroptreelist" droplistID="customer2">经销商</Col>
<Col name="CustomerValue" />
...
  请查看加载的XML数据, 请关注其中的<CustomId2>、<CustomValue>的内容.

7.服务器搜索的下拉,允许分页显示,例子在后续的“20.分页的下拉”中: