演示功能1:下拉过滤:“省份”和“城市”都是下拉输入,但是二者之间有过滤的逻辑关系,在js中设定了“城市”下拉的过滤表达式
Example1: “省份”采用dropTreelist
树列表的XML描述文件, 以及它的关联下拉 省份城市
Example2: “省份”采用dropList
树列表的XML描述文件, 它的关联下拉 "城市" 同左
1.它的OnReady( )部分:
AF1.func("Build", "treelist/t16.xml");
//表达式:cityId列的下拉的provinceId列=当前行的provId
var exp = "provinceId=provId@parent \r\n cityId";
AF1.func("Filter", exp);
2.它的OnEvent( )部分,仅用于清除CityId:
if(Event=="DropdownSelChanged" && p2=="provId")
 AF1.func("SetCellData", p1 + "\r\n cityId \r\n");
1.它的OnReady( )部分:
AF2.func("Build", "treelist/t16_2.xml");
//表达式:cityId列的下拉的provinceId列=当前行的provId
var exp = "provinceId=provId@parent \r\n cityId";
AF2.func("Filter", exp);
2.它的OnEvent( )部分,仅用于清除CityId:
if(Event=="EditChanged" && p2=="provId")
 AF2.func("SetCellData", p1 + "\r\n cityId \r\n");


演示功能2:“省份”下拉后,“城市”能立即自动选该省份的第一个城市

关键点1. 设置 autoUpdate=true, 使得“省份”下拉选中后,“省份"能及时从输入缓存更新到单元格:
function OnReady(id)
{
 ...
 else if(id=='AF3') {
  AF3.func("Build", "treelist/t16.xml \r\n autoUpdate=true");  //注:autoUpdate="true" 也可以直接写在XML文件的 Properties 中
  ...
关键点2. 在事件中,查找该省份的第一个城市:
function OnEvent(id, Event, p1, p2, p3, p4)
{
 ...
 else if(id=='AF3') {
  if(Event == "DropdownSelChanged") {
   if(p2 == "provId") {
    var prov = AF3.func("GetCellData", p1 + "\r\n" + p2);   //取得所选的"省份"
    AF3.func("ApplyFilter", p1 + "\r\n cityId");   //强制让过滤立即生效
    var h = AF3.func("GetHandle", "cityId");    //取得“城市”的下拉句柄
    var row = AF3.func(h + "find", "provinceId='" + prov + "'");   //从下拉中找到该省份的第一个城市的行号
    var s = AF3.func(h + "GetCellData", row + " \r\n cityId");   //取得城市
    AF3.func("SetCellData", p1 + "\r\n cityId \r\n" + s );   //置城市
   }
  }...
疑问分析
问一.上述语句第10行,是从下拉树列表中查找“省份”相匹配的行,按理说执行过 ApplyFilter,下拉中的所有行都应该属于这个省份的了,为什么还要执行 Find 函数查找呢?
.下拉列的 DropTreeList 对象真正被创建的时刻是首次下拉时,如果没有被下拉过,ApplyFilter函数其实是无效的.

问二.在这个例子中,autoUpdate属性置为true有什么用处?
.autoUpdate=true目的是为了让 DropdownSelChanged 事件在触发前的瞬间,就让下拉选中的数据立即更新到树列表中,就象 EditChanged 事件那样.
  我们知道,EditChanged事件通常是在焦点离开的时候触发的,联动下拉的效果没有 DropdownSelChanged 来得直接.
  此外应注意:autoUpdate="true"后,用户也就无法用 Esc 键反悔了.