【问题标题】:change filtration criteriain smartGWT更改 smartGWT 中的过滤标准
【发布时间】:2014-04-24 17:15:15
【问题描述】:

我正在开发一个 smartGWT 应用程序,并且我想以不同于默认方式的方式过滤 listGrid 字段(即默认过滤基于对包含匹配的删除)

为了更加痉挛,举个例子:

如果一个文件有 2 个值,其中一个是单词“valid”,另一个是单词“invalid”,则过滤可以正确搜索单词 invalid 但当我想查看“valid”时,它会给出我所有的“有效”和“无效”词,因为“无效”由“in”+“valid”组成

registeredDate = new DataSourceDateField("registrationDate", voc.registeredDate());  
registeredDate.setRequired(true);

verificationDate = new DataSourceDateField("lastVerificationDate", voc.verificationDate());  
verificationDate.setRequired(true); 

与其他所有字段相同

这就是我填写记录的方式:

registeredUsersRecords = new ListGridRecord[registeredUsers.length()];

ListGridRecord record = new ListGridRecord();
                record.setAttribute(ID, user.getId());
                record.setAttribute("firstName", user.getFirstName());
                record.setAttribute("lastName", user.getLastName());
                record.setAttribute("email", user.getEmail());
                record.setAttribute("userMainType", type);
                record.setAttribute("isActivated", (user.isActivated())? voc.active(): voc.inActive());
                record.setAttribute("country", user.getSelectedCountry().getValue());
                record.setAttribute("companyName", user.getCompanyName());
                record.setAttribute("registrationDate", user.getRegistrationDate());
                record.setAttribute("lastVerificationDate", user.getVerificationDate());
                registeredUsersRecords[i] = record;

然后我将它们放入数据源:

    DataSource ds = new DataSource();
    ds.setClientOnly(true);
    ds.setFields(fName, lName, email, type,typeDetails, status, country, companyName, registeredDate,verificationDate);
    for(int i = 0; i< registeredUsersRecords.length; i++){
        ds.addData(registeredUsersRecords[i]);
    }
    registeredUsersListGrid.setDataSource(ds);
    registeredUsersListGrid.fetchData();

【问题讨论】:

    标签: java gwt filtering smartgwt


    【解决方案1】:

    我认为FilterEditorSubmitHandler 会解决你的问题。


    我已经在您的最后一个问题date filtering not working in smart gwt 发布了示例代码。

    你必须对它进行一些修改,如下所示:

    注意:在下面的示例代码中,我已将过滤条件运算符从 ICONTAINS 替换为 STARTS_WITH。根据您的要求进行修改。

    --编辑--

    完整代码:

        class User {
            private int id;
            private String firstName;
            private Date registrationDate;
    
            public User(int id, String firstName, Date registrationDate) {
                this.id = id;
                this.firstName = firstName;
                this.registrationDate = registrationDate;
            }
    
            public int getId() {
                return id;
            }
    
            public String getFirstName() {
                return firstName;
            }
    
            public Date getRegistrationDate() {
                return registrationDate;
            }
    
        }
    
        DateTimeFormat format = DateTimeFormat.getFormat("MM/dd/yyyy");
    
        User[] registeredUsers = new User[] { new User(1, "valid", format.parse("01/20/2014")),
                new User(2, "invalid", format.parse("05/20/2013")),
                new User(3, "valid", format.parse("02/20/2014")) };
    
        ListGridRecord[] registeredUsersRecords = new ListGridRecord[registeredUsers.length];
    
        for (int i = 0; i < registeredUsers.length; i++) {
            User user = registeredUsers[i];
            ListGridRecord record = new ListGridRecord();
            record.setAttribute("id", user.getId());
            record.setAttribute("firstName", user.getFirstName());
            record.setAttribute("registrationDate", user.getRegistrationDate());
            registeredUsersRecords[i] = record;
        }
    
        DataSourceDateField registeredDate = new DataSourceDateField("registrationDate", "Date");
        DataSourceTextField firstName = new DataSourceTextField("firstName", "Name");
        DataSourceIntegerField id = new DataSourceIntegerField("id", "ID");
        id.setRequired(true);
        id.setPrimaryKey(true);
        id.setHidden(true);
    
        DataSource ds = new DataSource();
        ds.setClientOnly(true);
        ds.setFields(id, firstName, registeredDate);
        for (int i = 0; i < registeredUsersRecords.length; i++) {
            ds.addData(registeredUsersRecords[i]);
        }
    
        final ListGrid registeredUsersListGrid = new ListGrid();
    
        registeredUsersListGrid.setDataSource(ds);
        registeredUsersListGrid.fetchData();
        registeredUsersListGrid.setShowFilterEditor(true);
    
        registeredUsersListGrid.addFilterEditorSubmitHandler(new FilterEditorSubmitHandler() {
    
            @Override
            public void onFilterEditorSubmit(FilterEditorSubmitEvent event) {
    
                event.cancel();
    
                if (event.getCriteria() != null) {
    
                    AdvancedCriteria advancedCriteria = event.getCriteria().asAdvancedCriteria();
    
                    // store only single criteria for each field(column)
                    Map<String, Criterion> criterions = new HashMap<String, Criterion>();
                    for (final Criterion criterion : advancedCriteria.getCriteria()) {
    
                        System.out.println(criterion.getFieldName());
                        System.out.println(criterion.getValueAsString());
                        System.out.println(criterion.getOperator());
    
                        if (criterion.getOperator() == OperatorId.ICONTAINS) {
                            Criterion newCritearia = new Criterion(criterion.getFieldName(),
                                    OperatorId.STARTS_WITH, criterion.getValueAsString());
                            criterions.put(criterion.getFieldName(), newCritearia);
                        } else {
                            criterions.put(criterion.getFieldName(), criterion);
                        }
    
                    }
    
                    if (criterions.size() > 0) {
                        AdvancedCriteria filterCriteria = new AdvancedCriteria(OperatorId.AND,
                                criterions.values().toArray(new Criterion[] {}));
                        registeredUsersListGrid.fetchData(filterCriteria);
                    }
    
                }
    
            }
        });
    
        Button button = new Button("Clear all filters");
        button.addClickHandler(new ClickHandler() {
    
            @Override
            public void onClick(ClickEvent event) {
                registeredUsersListGrid.fetchData();
            }
        });
    
        VLayout layout = new VLayout();
        layout.setWidth("200px");
        layout.setHeight("200px");
    
        layout.addMember(button);
        layout.addMember(registeredUsersListGrid);
        layout.draw();
    

    【讨论】:

    • 不,它有错误,我不知道如何处理它
    • 请你告诉我你在说什么错误,以便我解决它。
    • 感谢您的兴趣,当我填写过滤器并按 inter 时,列表网格中不会出现任何数据,请稍后列出调试
    • 控制台打印什么?我在代码中添加了一些 SOP 来检查应用的标准。
    • 假设我想过滤 isActivated 字段的值以获取以“in”开头的单词,那么控制台上出现的内容就是 ICONTAINS 中的 isActivated
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    相关资源
    最近更新 更多