2010-09-29 18 views
6

Tengo un AjaxFallbackDefaultDataTable que contiene una fila por resultado de prueba. Un resultado de prueba puede tener una nota adjunta a la misma, que debe ser claramente visible por debajo de la resultado de la prueba, es de esperar que da una tabla similar a la siguiente:Cómo insertar 'sub-filas' en una Wicket DataTable

| Test | Result | Appraisal | 
|------|--------|-----------| 
| 1 | 20.0 | PASS | 
| 2 | 1.50 | FAIL | 
| Note: This is an epic fail| 
| 3 | 19.4 | PASS | 
| 4 | 14.9 | PASS | 

¿Hay alguna manera de lograr esta inserción fila (preferiblemente con extensión de columna) usando las construcciones Wicket DataTable. A medida que profundizo en la fuente puedo encontrar Item renderizadores, pero nada que se ocupe de una fila.

Actualmente tengo el siguiente:

// Create the sortable data provider. 
SortableDataProvider<TestResult> provider = new SortableDataProvider<TestResult>() { 
    //... hibernate pagination code ... 
}; 

List<IColumn> columns = new ArrayList<IColumn>(); 
columns.add(new TextFilteredPropertyColumn(new Model<String>("Test"), "test", "test")); 
columns.add(new TextFilteredPropertyColumn(new Model<String>("Result"), "result", "result")); 
columns.add(new TextFilteredPropertyColumn(new Model<String>("Appraisal"), "appraisal", "appraisal")); 

// Create a new AJAX table using the sortable, filtered data provider. 
final AjaxFallbackDefaultDataTable dataTable = new AjaxFallbackDefaultDataTable("testResultTable", columns.toArray(new IColumn[0]), provider, 20);// 20 = number of rows per page 

Respuesta

10

No creo que hay una manera limpia de hacer eso, usted tendrá que cortar el código HTML resultante.

Me adjuntar un comportamiento a medida para las filas que genera el HTML necesario de forma automática, algo como esto:

new AjaxFallbackDefaultDataTable<MyCustomObject>(
    id, columns, dataProvider, rowsPerPage){ 

    @Override 
    protected Item<MyCustomObject> newRowItem(String id, 
     int index, 
     final IModel<MyCustomObject> model){ 
     Item<MyCustomObject> item = super.newRowItem(id, index, model); 
     item.add(new AbstractBehavior(){ 

      private static final long serialVersionUID = 1L; 

      /** 
      * {@inheritDoc} 
      */ 
      @Override 
      public void onRendered(Component component){ 
       if(model.getObject().isEpicFail()){ 
        component.getResponse().write(
        "<tr><td colspan=\"3\">This is an epic fail</td></tr>"); 
       } 
      } 

     }); 
     return item; 
    } 

    private static final long serialVersionUID = 1L; 

} 
+0

Eso es tanto en términos absolutos en el clavo y una respuesta muy rápida. Muchas gracias por eso, me he estado rascando la cabeza sobre este problema durante la semana pasada. ¡Aclamaciones! – spikeheap

+0

Sin problema Wicket es realmente fácil una vez que te das vuelta, pero eso lleva algo de tiempo. –

+0

Es un poco feo renderizar tu propio HTML: o. Pero anular el nuevo RowItem es un buen comienzo, debe crear un Panel y agregarlo al elemento. – RobAu

0

Si vistazo a la clase NavigationToolbar (extensión, DataTable) cuando se mira desde el punto de vista HTML existe es una fila de la tabla html, la construcción del objeto es bastante diferente pero el resultado es bueno, otros datos se presentan en la fila HTML no es una fila en la tabla Java sentido (del código que el navegador no es parte de la tabla objeto, es externo desde ese punto de vista.

Niza fragmento de código para analizar

Cuando mi Datatable enriquecido para datos será plataforma para presentar visualmente informes con subtotal, sé que esto será posible

Cuestiones relacionadas