【问题标题】:GWT DataGrid checkboxesGWT 数据网格复选框
【发布时间】:2015-01-13 02:35:53
【问题描述】:

使用 GWT 2.6.1、UiBinder、DataGrid。
还使用 SingleSelectionModel 选择单行:

final SingleSelectionModel<User> selectionModel = new SingleSelectionModel<>(keyProvider);

复选框列:

// checkboxes
    Column<User, Boolean> checkBoxColumn = new Column<User, Boolean>(
            new CheckboxCell(false, false)) {
        @Override
        public Boolean getValue(User user) {
            return user.isChecked();
        }
    };

    checkBoxColumn.setFieldUpdater(new FieldUpdater<User, Boolean>() {
        @Override
        public void update(int index, User user, Boolean value) {
            user.setChecked(value);
        }
    });

所以我将“已检查”用户状态存储为用户实体类中的布尔字段,没有 完全使用 SelectionModel。

现在我需要实现自定义标题复选框以选择/取消选择列中的所有复选框。

public class CheckboxHeader extends Header<Boolean> {

    public CheckboxHeader(CheckboxCell cell) {
        super(cell);
    }

    @Override
    public Boolean getValue() {
        return null;
    }
}

不知道如何正确实现此标题类以在 DataGrid 中添加列:

dataGrid.addColumn(checkBoxColumn, new CheckboxHeader(new CheckboxCell(false, false)));

另一个麻烦是通过选中其他复选框来启用/禁用所有这些复选框 不在 DataGrid 中。
如何从列/selectionmodel/etc 中检索所有复选框并一一启用/禁用它们? 感谢任何建议。

【问题讨论】:

    标签: java user-interface gwt checkbox datagrid


    【解决方案1】:

    混合数据模型(用户实体)和用户界面状态 (isSelected) 绝不是一个好主意。

    你可以这样做(用你的对象替换 T,或者创建一个可以重复使用的列对象):

    Column<T, Boolean> checkColumn = new Column<T, Boolean>(new CheckboxCell()) {
        @Override
            public Boolean getValue(T object) {
                return getSelectionModel().isSelected(object);
            }
        };
        checkColumn.setFieldUpdater(new FieldUpdater<T, Boolean>() {
            @Override
            public void update(int index, T object, Boolean value) {
                getSelectionModel().setSelected(object, value);
                dataProvider.refresh();
            }
        });
    
    myDataGrid.setSelectionModel(getSelectionModel(), DefaultSelectionEventManager.<T> createCheckboxManager(0));
    
    Header<Boolean> selectAllHeader = new Header<Boolean>(new HeaderCheckbox()) {
    
        @Override
        public Boolean getValue() {
            for (T item : getVisibleItems()) {
                if (!getSelectionModel().isSelected(item)) {
                    return false;
                }
            }
            return getVisibleItems().size() > 0;
        }
    };
    selectAllHeader.setUpdater(new ValueUpdater<Boolean>() {
    
        @Override
        public void update(Boolean value) {
            for (T object : getVisibleItems()) {
                getSelectionModel().setSelected(object, value);
            }
        }
    });
    myDataGrid.addColumn(checkColumn, selectAllHeader);
    

    【讨论】:

    • 很好,谢谢,找到了类似的解决方案here。通过选中不在 DataGrid 中的其他复选框来启用/禁用所有复选框怎么样?如何从 column/selectionmodel/etc 中检索所有复选框并一一启用/禁用它们?
    • selectionModel.getSelectedSet() 为您提供选定对象的列表。您也可以使用selectionModel.clear()selectionModel.setSelected(Object object, boolean selected)。您可以将 SelectionHandler 添加到任何其他复选框,并在调用此选择处理程序时执行与我的代码示例中的标题相同的循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 2011-04-18
    • 2012-03-11
    • 2010-11-24
    • 2020-03-22
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多