Filter 如何过滤树丛?

Filter 如何过滤树丛?,filter,smartgwt,treegrid,Filter,Smartgwt,Treegrid,我目前有一个TreeGrid,它显示具有名称的节点。数据来自手动填充的数据源 在nodeName字段上设置过滤器时,过滤器不会递归完成,因此我只能过滤根节点 如何告诉筛选器在子节点中搜索匹配项 PS:在下面的代码中,我有3个节点RootRunChild1。如果我尝试使用过滤器并键入“R”,我将获得根目录和运行。但是如果我键入“C”,我会得到“未找到任何结果”” 代码 数据源: 包murex.otk.gwt.gui.client.ui.datasource; 导入java.util.List; 导

我目前有一个
TreeGrid
,它显示具有名称的节点。数据来自手动填充的
数据源

nodeName
字段上设置过滤器时,过滤器不会递归完成,因此我只能过滤根节点

如何告诉筛选器在子节点中搜索匹配项

PS:在下面的代码中,我有3个节点
Root
Run
Child1
。如果我尝试使用过滤器并键入“R”,我将获得
根目录
运行
。但是如果我键入“C”,我会得到“未找到任何结果”

代码 数据源:
包murex.otk.gwt.gui.client.ui.datasource;
导入java.util.List;
导入murex.otk.gwt.gui.client.ui.record.TreeRecord;
导入com.smartgwt.client.data.DataSource;
导入com.smartgwt.client.data.fields.DataSourceIntegerField;
导入com.smartgwt.client.data.fields.DataSourceTextField;
公共类ClassesDataSource扩展了DataSource{
私有静态ClassesDataSource实例=null;
公共静态类DataSource getInstance(){
if(实例==null){
实例=新的ClassesDataSource(“ClassesDataSource”);
}
返回实例;
}
私有ClassesDataSource(字符串id){
setID(id);
DataSourceTextField nodeNameField=新的DataSourceTextField(“nodeName”);
nodeNameField.setCanFilter(true);
nodeNameField.setRequired(true);
DataSourceIntegerField nodeIdField=新的DataSourceIntegerField(“nodeId”);
nodeIdField.setPrimaryKey(true);
nodeIdField.setRequired(true);
DataSourceIntegerField nodeParentField=新的DataSourceIntegerField(“nodeParent”);
nodeParentField.setRequired(true);
setForeignKey(id+“.nodeId”);
nodeParentField.setRootValue(0);
设置字段(NodeField、nodeNameField、nodeParentField);
setClientOnly(真);
}
public void populatedDataSource(列出类名){
树根=新树根(“根”,0);
addData(根);
TreeRecord child1=新的TreeRecord(“child1”,root.getNodeId());
addData(child1);
TreeRecord child2=新的TreeRecord(“Run”,child1.getNodeId());
addData(child2);
}
}
主要
模块加载()上的公共void{
ClassesDataSource.getInstance().populateDataSource(新ArrayList());
最终TreeGrid employeeTree=新的TreeGrid();
设置高度(350);
setDataSource(ClassesDataSource.getInstance());
employeeTree.setAutoFetchData(true);
TreeGridField=新的TreeGridField(“节点名称”);
字段。setCanFilter(true);
employeeTree.setFields(字段);
employeeTree.setShowFilterEditor(true);
setAutoFetchAsFilter(true);
employeeTree.setFilterOnKeypress(true);
employeeTree.draw();
}
我解决了这个问题


问题是筛选器正在调用服务器获取数据,而我的数据源设置为“仅客户端”
。要解决此问题,
employeeTree
必须具有
employeeTree.setLoadDataOnDemand(false)

您也可以使用employeeTree.setKeepParentsOnFilter(true)


我试过这个,但显然有个bug。提供子字符串时,搜索未返回正确的结果
package murex.otk.gwt.gui.client.ui.datasource;

import java.util.List;

import murex.otk.gwt.gui.client.ui.record.TreeRecord;

import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.data.fields.DataSourceIntegerField;
import com.smartgwt.client.data.fields.DataSourceTextField;

public class ClassesDataSource extends DataSource {

    private static ClassesDataSource instance = null;

    public static ClassesDataSource getInstance() {
        if (instance == null) {
            instance = new ClassesDataSource("classesDataSource");
        }
        return instance;
    }

    private ClassesDataSource(String id) {
        setID(id);

        DataSourceTextField nodeNameField = new DataSourceTextField("nodeName");
        nodeNameField.setCanFilter(true);
        nodeNameField.setRequired(true);

        DataSourceIntegerField nodeIdField = new DataSourceIntegerField("nodeId");
        nodeIdField.setPrimaryKey(true);
        nodeIdField.setRequired(true);

        DataSourceIntegerField nodeParentField = new DataSourceIntegerField("nodeParent");
        nodeParentField.setRequired(true);
        nodeParentField.setForeignKey(id + ".nodeId");
        nodeParentField.setRootValue(0);

        setFields(nodeIdField, nodeNameField, nodeParentField);
        setClientOnly(true);
    }

    public void populateDataSource(List<String> classNames) {
        TreeRecord root = new TreeRecord("Root", 0);
        addData(root);
        TreeRecord child1 = new TreeRecord("Child1", root.getNodeId());
        addData(child1);
        TreeRecord child2 = new TreeRecord("Run", child1.getNodeId());
        addData(child2);
    }

}
public void onModuleLoad() {
    ClassesDataSource.getInstance().populateDataSource(new ArrayList<String>());
    final TreeGrid employeeTree = new TreeGrid();
    employeeTree.setHeight(350);
    employeeTree.setDataSource(ClassesDataSource.getInstance());
    employeeTree.setAutoFetchData(true);
    TreeGridField field = new TreeGridField("nodeName");
    field.setCanFilter(true);
    employeeTree.setFields(field);
    employeeTree.setShowFilterEditor(true);     
    employeeTree.setAutoFetchAsFilter(true);
    employeeTree.setFilterOnKeypress(true);
    employeeTree.draw();
}