2010-09-29 17 views
6

J'ai un AjaxFallbackDefaultDataTable qui contient une ligne par résultat de test. Un résultat d'essai peut avoir une note jointe à ce qui doit être bien en évidence au-dessous du résultat du test, ce qui, espérons un tableau similaire à ce qui suit:Comment insérer des 'sous-lignes' dans un DataTable Wicket

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

Est-il possible de réaliser cette insertion de la ligne (de préférence avec colonne spanning) en utilisant les constructions Wicket DataTable. Comme je fouille dans la source, je peux trouver des moteurs de rendu Item mais rien qui traite d'une rangée.

Actuellement, je donne les résultats suivants:

// 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 

Répondre

10

Je ne pense pas qu'il y ait une manière propre de le faire, vous devrez pirater le code HTML résultant.

Je joins un comportement personnalisé aux lignes qui génère le code HTML requis automatiquement, quelque chose comme ceci:

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

C'est à la fois absolument parfait et une réponse très rapide. Merci beaucoup pour cela, je me suis gratté la tête à propos de ce problème la semaine dernière. À votre santé! – spikeheap

+0

Pas de problème. Wicket est réellement facile une fois que vous envelopper votre tête autour d'elle, mais cela prend du temps. –

+0

Il est assez moche de rendre votre propre HTML: o. Mais remplacer le newRowItem est un bon début, vous devez créer un Panel et l'ajouter à l'item. – RobAu

0

Si regard sur la classe NavigationToolbar (extension, DataTable) lors de la recherche du point de vue HTML il est une rangée de table html, la construction d'objet est assez différente mais le résultat est bon, d'autres données sont présentées dans la rangée HTML n'étant pas une rangée dans le sens Java table (du code que le navigateur ne fait pas partie de la table d'objet

Joli code de fragment à analyser

Quand mon Datatable enrichi pour les données sera plate-forme pour les rapports à présenter visuellement avec sous-total, je sais que ce sera possible