Le 13/02/2013 07:26, Adrien Cheype a écrit :
Il suffit de ne pas utiliser PropertyColumn et de créer à la place une classe interne anonyme qui hérite d'AbstractColumn<Molecule>. Exemple : column.add(new AbstractColumn<Molecule>(new Model<String>(getString("Molecule.nomCommun"))) { @Override public void populateItem(Item<ICellPopulator<Molecule>> item, String componentId, IModel<Molecule> rowModel) { item.add(new Label(componentId, RowMoleculeFinder.getNomCommun(rowModel.getObject())); } });
ou mieux encore : garder PropertyColumn<Molecule> mais utiliser la stratégie de surchage non pour trouver la valeur mais le nom de propriété. Ainsi pour continuer avec l'exemple du nom commun, la méthode RowMoleculeFinder.getNomCommunProperty(Molecule molecule) rendrait "nomCommun", tandis que RowMoleculeFinder.getNomCommunProperty(MoleculeProvenance moleculeProvenance) rendrait "molecule.nomCommun".
Par ailleurs, je viens de remarquer que vous étendez systématiquement dans cette page une PropertyColumn (ou ces dérivés tel DecimalPropertyColum, ...) au lieu d'AbstractColumn (les propriétés déclarées dans le constructeurs n'étant ensuite pas utilisées). Finalement, nous avons trouvé quelque chose de plus simple: creer un bean MoleculeProvenanceBean instancié avec une Molécule ou une Molecule provenance.
Le bean a des getter/setter pour les propriétés à afficher dans la table. Et le code wicket est très simple et de la même forme que les autres tables: columns.add(new PropertyColumn<MoleculeProvenanceBean>(new Model<String>(getString("Molecule.nomCommun")), "nomCommun", "nomCommun")); Pendant que nous faisions ceci, nous avons détecter une chose étrange dans la gestion des tableaux wicket. Par exemple, pour le tableau des lots, voilà comment le provider du tableau est instancié: final List<Lot> lots = lotService.listLots(getSession().getUtilisateur()); LoadableDetachableSortableListDataProvider<Lot> lotsDataProvider = new LoadableDetachableSortableListDataProvider<Lot>(lots, getSession().getLocale()); Donc la liste est récupérée du service en une seule opération et cela devrait suffire à l'afficher. Cependant, dans le provider la methode getModel() est surchargée comme cela: public GenericLoadableDetachableModel<M> model(M object) { // return new Model<M>(object); return new GenericLoadableDetachableModel<M>(object); } qui, lorsqu'elle est appelée, va récupérer en base l'objet qui a le même id que l'objet actuel ??? Pourquoi ce genre de fonctionnement est-il en place ? Pourquoi n'utilise-t-on pas simplement la liste que l'on a chargé du service ? Le problème est encore plus remarquable ici: columns.add(new LinkableImagePropertyColumn<Lot>("images/edit.png", getString("Update"), getString("Update")) { @Override public void onClick(Item<ICellPopulator<Lot>> item, String componentId, IModel<Lot> model) { setResponsePage(new ManageLotPage(model.getObject().getIdLot(), currentPage)); } }); Lors du onClick() , la methode "model.getObject()" recharge dans la base de donnée l'object qui a le même id que l'objet du modèle courant sur lequel on récupère... son id :D Et dans la classe ManageLotPage, elle va le recharger encore pour l'afficher. -- Éric Chatellier - Code Lutin Tel: 02.40.50.29.28 - http://www.codelutin.com