代码之家  ›  专栏  ›  技术社区  ›  Greg Dougherty

带有DataSource的SmartGWT ListGrid,CellFormatter输出上的筛选器

  •  1
  • Greg Dougherty  · 技术社区  · 10 年前

    我正在使用带有DataSource的SmartGWT ListGrid。我成功地使用CellFormatter将数字文件大小数据显示为混合文本/数据(即“10 GB”而不是10737418240)。我已经设置了过滤。

    我想做的是让用户过滤CellFormatter输出,而不是底层数据。IOW,让用户在过滤框中键入“GB”,并获取大小在GB范围内的所有文件。DataSource在本地缓存,因此我不需要返回服务器获取数据。

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

    如有任何帮助,将不胜感激。非常感谢。 格雷格

    1 回复  |  直到 10 年前
        1
  •  2
  •   jauser    10 年前

    你有两种选择。首先是从数据源返回已经修改过的值,所以应该返回“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实例设置为要格式化的字段,并将SimpleTypeValueExtractor设置为覆盖用于显示、筛选和排序的getAtomicValue。

    还有其他方法可以重写-例如,如果您需要编辑网格中的值,您可能也应该设置SimpleTypeValueUpdater。