| 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.分页的下拉”中: