Filter SmartGWT ListGrid和数据源,CellFormatter输出上的过滤器

Filter SmartGWT ListGrid和数据源,CellFormatter输出上的过滤器,filter,datasource,smartgwt,listgrid,Filter,Datasource,Smartgwt,Listgrid,我将SmartGWT ListGrid与数据源一起使用。我成功地使用CellFormatter将数字文件大小数据显示为混合文本/数据(即“10GB”而不是10737418240)。我已经设置好了过滤 我想做的是让用户对CellFormatter输出进行过滤,而不是对底层数据进行过滤。这样,让用户在筛选框中键入“GB”,并获取大小在GB范围内的所有文件。数据源是在本地缓存的,因此我不会遇到返回服务器获取数据的问题 编辑:我使用CellFormatter的原因是因为它希望排序正确,当按递增顺序排序时

我将SmartGWT ListGrid与数据源一起使用。我成功地使用CellFormatter将数字文件大小数据显示为混合文本/数据(即“10GB”而不是10737418240)。我已经设置好了过滤

我想做的是让用户对CellFormatter输出进行过滤,而不是对底层数据进行过滤。这样,让用户在筛选框中键入“GB”,并获取大小在GB范围内的所有文件。数据源是在本地缓存的,因此我不会遇到返回服务器获取数据的问题

编辑:我使用CellFormatter的原因是因为它希望排序正确,当按递增顺序排序时,我希望200KB在10GB之前,而不是之后(在文本排序中,它们是颠倒的)。排序对我来说比过滤更重要,所以如果我必须让排序和过滤目标都具有相同的数据表示形式,我将放弃过滤工作

任何帮助都将不胜感激。非常感谢。
Greg

您有两种选择来完成此操作。首先是从数据源返回已修改的值,因此它应该返回“10GB”字符串值,而不是10737418240

第二种方法对我来说似乎更好——应该使用SimpleType功能。你可以举一个例子:

public class PopulationType extends SimpleType {

    public PopulationType() {
        super("population", FieldType.TEXT);
        // format values in the grid
        this.setSimpleTypeValueExtractor(new SimpleTypeValueExtractor() {
            @Override
            public Object getAtomicValue(Object value) {
                if (value instanceof Integer && ((Integer) value) > 1000000) {
                    return ((Integer) value) / 1000000 + " Mln";
                }
                return "" + value;
            }
        });
    }
}

public void onModuleLoad() {
    final ListGrid countryGrid = new ListGrid();  
    countryGrid.setWidth100();
    countryGrid.setHeight100();
    countryGrid.setAutoFetchData(true);
    countryGrid.setShowFilterEditor(true);
    countryGrid.setShowAllRecords(true);
    WorldXmlDS ds = WorldXmlDS.getInstance();
    ds.getField("population").setType(new PopulationType());
    countryGrid.setDataSource(ds);
    countryGrid.draw();
}
将SimpleType实例设置为要格式化的字段,并将SimpleType ValueExtractor设置为覆盖用于显示、筛选和排序的getAtomicValue


您还可以覆盖其他方法—例如,如果您需要编辑网格中的值,您可能还应该设置SimpleTypeValueUpdater。

所以我无法将筛选与排序分开?因为排序更为重要,我希望10GB的数据比200KB的数据“大”。实际上,它们似乎是分开的——只要将FieldType.TEXT更改为FieldType.INTEGER就可以了。另外,如果您想以某种方式覆盖排序的值,可以使用ListGridField.setSortNormalizer方法。我需要的是setSortNormalizer。非常感谢。