2014-11-15 2 views
1

Использование GWT 2.6.1, UiBinder, DataGrid.
использованием Также SingleSelectionModel, чтобы выбрать одну строку:Флаги GWT DataGrid

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

Другая беда в том, чтобы включить/отключить все эти флажки, проверив другой флажок, что ISN 't в DataGrid.
Как я могу извлечь все флажки из столбца/selectionmodel/etc и включить/отключить их по одному? Оцените любые предложения.

ответ

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); 
+0

хорошо, спасибо, нашел подобное решение [здесь] (https://code.google.com/p/google-web-toolkit/issues/detail?id=7014). Что касается включения/выключения всех флажков, установив флажок, который отсутствует в DataGrid. Как я могу получить все флажки из столбца/selectionmodel/etc и включить/отключить их по одному? – povadys

+0

'selectionModel.getSelectedSet()' дает вам список выбранных объектов. Вы также можете использовать 'selectionModel.clear()' и 'selectionModel.setSelected (Object object, boolean selected)'. И вы можете добавить SelectionHandler в любой другой флажок и сделать тот же цикл, что и в заголовке в моем примере кода, когда вызывается этот обработчик. –

Смежные вопросы