2011-05-30 23 views
5

Tengo una cellTable con una columna CheckBoxCell. Lo que trato de hacer es tener un conjunto de botones fuera de la celda que permita al usuario verificar/desmarcar automáticamente un conjunto diferente de elementos (por ejemplo, marcar todo/desmarcar todo, pero me gustaría tener reglas más complejas))GWT CellTable programmatically check CheckCellCell

Lo que no entiendo es cómo acceder al elemento (supongo que a través de valores de fila/col ???) y obtener/establecer el valor.

¿Alguien me puede ayudar a encontrar la manera de resolverlo?

Respuesta

15

Suponiendo que lo que quiere es obligar a la casilla de verificación para la "selección" y seleccionar fácilmente un grupo de elementos programáticamente (sutileza: seleccione elementos, lo que dará como resultado que se marque la casilla de verificación, en lugar de marcar casillas), usará un MultiSelectionModel.

Encontrará código de ejemplo en http://gwt.google.com/samples/Showcase/Showcase.html#!CwCellTable, es decir:

final MultiSelectionModel<ContactInfo> selectionModel = new MultiSelectionModel<ContactInfo>(
    ContactDatabase.ContactInfo.KEY_PROVIDER); 
cellTable.setSelectionModel(selectionModel, 
    DefaultSelectionEventManager.<ContactInfo> createCheckboxManager()); 
… 
Column<ContactInfo, Boolean> checkColumn = new Column<ContactInfo, Boolean>(
    new CheckboxCell(true, false)) { 
    @Override 
    public Boolean getValue(ContactInfo object) { 
    // Get the value from the selection model. 
    return selectionModel.isSelected(object); 
    } 
}; 
cellTable.addColumn(checkColumn, SafeHtmlUtils.fromSafeConstant("<br/>")); 
cellTable.setColumnWidth(checkColumn, 40, Unit.PX); 

Luego, para seleccionar un elemento (y tiene su casilla de verificación comprueba automáticamente), usted sólo tiene que hacer:

selectionModel.setSelected(item, true); 

y de manera similar puede obtener el conjunto de todos los elementos seleccionados con selectionModel.getSelectedSet().

+0

Gracias por la respuesta, pero no es mi caso: no quiero marcar/desmarcar mediante una selección de tabla, sino más bien usando un conjunto de botones fuera de la mesa. El enlace se encuentra entre el elemento de la columna y un botón fuera de la tabla – Noya

+0

El controlador de clic del botón * simplemente * tiene que "seleccionar" los elementos apropiados en el modelo de selección ('clear()' + 'setSelected (item, true)') , y el estado de las casillas de verificación se actualizaría en consecuencia (automáticamente). –

+0

@ThomasBroyer ¿Cómo podría seleccionar todos los elementos en varias páginas con un 'AsyncDataProvider'? – Nobody

3

No sé cómo configuró su cellTable, pero supongo que tiene un dataProvider vinculado. O un ListDataProvider o AsyncDataProvider. Desea modificar los datos en el proveedor para cambiar el estado de sus filas.

Aquí es un ejemplo sencillo de un selecto/deseleccionar todo, suponiendo que tiene una UiBinder con un CellTable y casilla:

public class MyView extends Composite { 

    private class MyTableRow { 
    private boolean checked; 

    public boolean isChecked() { 
     return this.checked; 
    } 

    public void setChecked(boolean checked) { 
     this.checked = checked; 
    } 

    } 

    interface MyViewUiBinder extends UiBinder<Widget, MyView> { 
    } 

    private static MyViewUiBinder uiBinder = GWT.create(MyViewUiBinder.class); 
    private ListDataProvider<MyTableRow> provider = new ListDataProvider<MyTableRow>(); 
    @UiField(provided = true) 
    CellTable<MyTableRow> table; 

    public MyView() { 
    this.table = new CellTable<MyTableRow>(); 
    Column<MyTableRow, Boolean> checkBoxColumn = new Column<MyTableRow, Boolean>(new CheckboxCell()) { 

     @Override 
     public Boolean getValue(MyTableRow object) { 
      return object.isChecked(); 
     } 

    }; 
    this.table.addColumn(checkBoxColumn); 
    this.initWidget(uiBinder.createAndBindUi(this)); 
    } 

    @UiHandler("selectAllBox") 
    public void onSelectAllClicked(ClickEvent e) { 
    for (MyTableRow row : this.provider.getList()) { 
     row.setChecked(((CheckBox)e.getSource()).getValue()); 
    } 
    } 

} 
+0

gracias. En mi caso estoy usando un AsyncDataProvider ... Trataré de seguir tu ejemplo y luego dar tu opinión – Noya