Как отфильтровать TreeGrid? - PullRequest
0 голосов
/ 01 марта 2012

У меня в настоящее время есть TreeGrid, который показывает узлы с именами . Данные поступают с заполненного вручную DataSource.

При установке фильтра в поле nodeName, фильтр не выполняется рекурсивно, и поэтому я могу фильтровать только корневой узел .

Как я могу сказать фильтру искать совпадения в дочерних узлах?

PS: в приведенном ниже коде у меня есть 3 узла Root> Run> Child1. Если я попробую фильтр и наберу " R ", я получу Root и Run. Но если я наберу " C ", я получу " результатов не найдено "

Код

DataSource:

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();
}

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Я решил это.

Проблема заключалась в том, что фильтр вызывал сервер для получения данных, в то время как мой источник данных был установлен на Client Only . Чтобы это исправить, employeeTree должен иметь employeeTree.setLoadDataOnDemand(false);

0 голосов
/ 26 марта 2012

Вы также можете использовать employeeTree.setKeepParentsOnFilter (true)

http://www.smartclient.com/smartgwtee/javadoc/com/smartgwt/client/widgets/tree/TreeGrid.html#setKeepParentsOnFilter(java.lang.Boolean)

...