| 1.上面是 Freeform 表头，下面是Treelist表体，实现了常见的主表-明细表的单据输入方式; 2.请注意分析源码中数据的加载方式;

1.上面是 Freeform 表头，下面是Treelist表体，实现了常见的主表-明细表的单据输入方式;
2.在本例中，表头和表体共享了同一个XML数据，OnReady( )源码如下;

    var count=0;
    function OnReady(id)
    {
     count++;
     if(count != 2) return;

     //创建Freeform、Treelist
     AFmaster.func("build", "treelist/freeform_master.xml");
     AFdetail.func("build", "treelist/t_detail.xml");

     //Freeform作为 Master 绑定到Treelist，以共享Treelist加载的数据中的<masterPart>下的内容
     var h = AFdetail.func("GetHandle", "");
     AFmaster.func("BindAsMaster", h + "\r\n masterPart");

     //Treelist加载数据，使用其中的<detailPart>下的数据
     //同时把<masterPart>部分数据交给了Freeform
     AFdetail.func("Load", "treelistdata/combine.xml \r\n Node=detailPart");
    }

表头、表体使用了数据中不同部分，示意如下：
当然，也不一定要采用上述绑定的做法，因为Freeform 和 Treelist本身都有Load( )函数可以加载数据。本例的目的为：
1.表头表体数据放在一起，可以减轻后端开发工作量;
2.减少Http请求数;
3.请注意上述OnReady( )中第13行源码，采用了一个变量readyCount，表示Treelist和Freeform全部已准备好才能绑定取数,因为本例中Treelist 和 Freeform处在不同的<div>中，而浏览器是以多线程方式工作的，写在脚本中靠前的位置的div未必先完成创建！
4.提交数据时，可以分别调用GetChangedXML( )取得二段XML，将其并在一起提交。请对表格作些操作，然后