IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

Ajout dynamique de lignes dans une datatable créée elle-même dynamiquement


Sujet :

JSF Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Points : 17
    Points
    17
    Par défaut Ajout dynamique de lignes dans une datatable créée elle-même dynamiquement
    Bonjour,

    Alors voila, je suis entrain de creer une page de gestion de groupe en JSF.
    Pour cela, l'utilisateur doit etre capable de creer une datatable par groupe. Enfin, il doit etre capable d'ajouter une entree dans ces datatable quand il veut ajouter une personne dans un groupe.

    La creation de table dynamique ne pose pas de soucis particulier. Ma page jsf contien un h:panelGrid bindé à un objet dans le backing bean ou se trouve également ma fonction de création de table.
    Chacune des tables creer doit posseder sa propre instance de ManagedBean dont je me sers pour faire l'interface entre IHM et BDD. Ces managed bean sont donc creer en même temps que les datatables, stockés dans une liste, et bindés a la datatable. Rien de bien sorcier.

    Hop, fonction de creation de table:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    public void ajouterGroupe(){
            //Panel qui contiendra l'ensemble des composants à ajouter pour creer un nouveau groupe de rotation
            HtmlPanelGrid panel = new HtmlPanelGrid();
            //Parametrage du panel
            panel.setId("panelSemaineTypeGroupe"+panelGroupesSemaineType.getChildCount());
            panel.setStyle("width:100%;");
     
     
            //Nouvelle table contenant les horaires types
            HtmlDataTable table = new HtmlDataTable();
            table.setId("tableSemaineTypeGroupe"+panelGroupesSemaineType.getChildCount()); //identification de la nouvelle table
            table.setBorder(1); //style de la nouvelle table
            SemaineTypeManagedBean mb = new SemaineTypeManagedBean(panelGroupesSemaineType.getChildCount());
            mb.setBackingSemaineType(this); //Lien
            mb.setSemainesTypesDAO(semainesTypesDAO);
            semaineTypeManagedBeans.add(mb);
            table.setValue(semaineTypeManagedBeans.get(panelGroupesSemaineType.getChildCount()).getModel().getWrappedData());
            table.setVar("ligne");
            table.setColumnClasses("td");
            table.setHeaderClass("th");
            table.setRowClasses("list-row-even td, list-row-odd td");
            table.setStyleClass("tableau");
            table.setStyle("left:20%;width:60%;");
            listeTable.add(table);
     
            //Colonne des totaux
            UIColumn totaux = new UIColumn();
            totaux.setId("totauxGroupe"+panelGroupesSemaineType.getChildCount());
            HtmlOutputText headerTotaux = new HtmlOutputText();
            headerTotaux.setId("totalGroupeHeader"+panelGroupesSemaineType.getChildCount());
            headerTotaux.setValue("Total");
            totaux.setHeader(headerTotaux);
            //Texte de la colonne des Totaux
            HtmlOutputText total = new HtmlOutputText();
            total.setId("totalGroupe"+panelGroupesSemaineType.getChildCount());
            //total.setValueExpression("",ExpressionFactory.newInstance().createValueExpression(FacesContext.getCurrentInstance().getELContext(),"#{ligne.total}",Integer.class));
            total.setValue("bbb");
            //Ajout du texte dans la colonne
            totaux.getChildren().add(total);
     
            //Ajout des colonnes à la table
            table.getChildren().add(totaux);
     
            //Bouton d'ajout de ligne
            Button ajoutLigne = new Button();
            ajoutLigne.setId("ajoutTech"+panelGroupesSemaineType.getChildCount());
            ajoutLigne.setImageURL("/resources/img/ajouter.jpg");
            ajoutLigne.setToolTip("Ajouter un technicien");
            Class[] parametreAction = new Class[] {ActionEvent.class};
            ajoutLigne.setActionListenerExpression(ExpressionFactory.newInstance().createMethodExpression(FacesContext.getCurrentInstance().getELContext(),"#{SemaineType.ajouterCode}",null,parametreAction));
     
     
            //Panel de sepraration pour eviter que les tables représentant les groupes ne soient collées les unes aux autres
            HtmlPanelGrid panelSeparation = new HtmlPanelGrid();
            panelSeparation.setId("panelSeparationSemaineTypeGroupe"+panelGroupesSemaineType.getChildCount());
            panelSeparation.setStyle("width:15px;");
     
            // Ajout de la datatable au panel principal
            panel.getChildren().add(table);
            // Ajout du bouton d'ajout de ligne
            panel.getChildren().add(ajoutLigne);
            // Ajout du panel de séparation au panel principal
            panel.getChildren().add(panelSeparation);
     
            // Ajout du panel créer dans la page
            panelGroupesSemaineType.getChildren().add(panel);
        }
    Comme vous pouvez le voir, je crée egalement un bouton en même temps que ma table qui permet d'ajouter une ligne dans ma table grace a cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        public void ajouterCode(ActionEvent ae){
            String buttonId = ((Button)ae.getSource()).getId();
            DataModel temp = (DataModel) (this.semaineTypeManagedBeans.get(Integer.valueOf(buttonId.substring(9)))).getModel();
            ((List)temp.getWrappedData()).add(new SemaineTypeIHM());
            this.listeTable.get(Integer.valueOf(buttonId.substring(9))).setValue(temp);
    (Cette version est plus compliqué que nécessaire, je sais, mais je m'en suis servie pour le debuggage et etre sur que les lignes etaient bien ajoutée correctement dans les données)
    Je recupere l'id du bouton pour trimmer le numero de groupe que j'ai rajouter a la fin de son ID pour identifier la table a laquelle je dois rajouter une ligne.

    Voila, je sais, parceque je l'ai deja fait dans une table normale, ecrite dès le depart dans la jsp, que d'ajouter un objet du type à afficher à la liste alimentant le datamodel bindé a la datatable permet d'ajouter une ligne vide au niveau graphique.

    Pourtant, ce n'est pas le cas ici.
    Mes fonctions sont bien appelées quand elles le doivent. Et donc, avec le debugger, je vois bien que les nouvelles instance d'objet sont bien créées et ajoutées à ma liste qui alimente ma datatable. Pourtant, absolument aucune nouvelle ligne n'est affichée. Et je n'arrive vraiment pas a voir pourquoi.

    Est-ce-que vous pourriez me dire ce qui pourrait causer un tel problème, s'il vous plait ? Parceque la, je seche, et ca me bloque completement pour l'avancement de mon projet.

    Merci,

    Yann

  2. #2
    Membre confirmé

    Homme Profil pro
    Chomeur
    Inscrit en
    Juin 2006
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 347
    Points : 452
    Points
    452
    Par défaut
    Salut yann,

    Juste une supposition, se pourrait il que cela soit uniquement un probleme de rafraichissement de page? Si tu essaye de rafraichir via l'explorateur internet ta ligne s'ajoute t'elle?

    Bon courage,
    Tif

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Points : 17
    Points
    17
    Par défaut
    Salut tif!

    Un probleme de rafraishissement est effectivement le seul truc que je vois qui pourrais expliquer un probleme comme ca. J'avais donc deja testé le rafraichissement comme ca, sans succès, malheureusement.

    Je continue donc de chercher, mais merci quand même

    Yann

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Points : 17
    Points
    17
    Par défaut
    Salut !

    Bon, je continue de bloquer sur ce probleme, sans pouvoir progresser plus en avant dans mon projet, car de nombreuses fonctionnalités du cahier des charges se basent sur cette fonctionnalité d'ajout dynamique.

    Pour pouvoir continuer a avancer un peu j'ai contourner le probleme en creant les tables statiquement, mais c'est vraiment trop limitatif et peu evolutif.

    Mais si personnes n'a d'idee, je ne vois pas ce que je pourrais faire d'autre

    Merci d'avance pour toute aide,

    Yann

  5. #5
    Membre confirmé

    Homme Profil pro
    Chomeur
    Inscrit en
    Juin 2006
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 347
    Points : 452
    Points
    452
    Par défaut
    Salut,

    Une petite proposition: Si tu laissait les tables en statique mais que tu les cachais avec l'attribut "rendered", ensuite tu dois gérer les affichages/disparitions. Ta page va etre alourdie mais pour avoir utiliser pas mal de rendered, ca ne te fais perdre du temps qu'au premier chargement (car tout est chargé) et par la suite c'est completement transparent.

    Bon courage,
    Tif

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Points : 17
    Points
    17
    Par défaut
    Tif, c'est la methode que j'utilise pour contourner le probleme en effet

    Malheureusement, vu qu'un utilisateur peut facilement devoir creer plusieurs dizaines de groupes, tout comme elle ne peut en creer que deux, ce n'est pas vraiment viables. Ca m'obligerait a creer de nombreuses tables dans le jsp, et sans jamais etre sur d'en avoir creer suffisament. (Enfin, c'est ce que j'ai fait pour l'instant) De plus, chacune des tables dispose de son propre managed bean, que je devrais donc declarer dans le faces-config ce qui l'alourdirait enormement.

    Donc même si j'avais le courage de creer une centaine de tables dans mon jsp puis de definir une centaine de managed bean dans le xml (je crois que je m'evanouirais au 20eme, et encore...) et creer la fonction pour les rendres quand besoin est ca ne serait pas evolutif non plus. Si encore le nombre de groupes maxi etait faible ca irait, mais la, aucune idee de la limite.

    La galère, quoi

    Yann

Discussions similaires

  1. ajout de nouvelle lignes dans une DATAGRID
    Par yayasam dans le forum Windows Presentation Foundation
    Réponses: 12
    Dernier message: 23/04/2010, 18h36
  2. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  3. Sélection de ligne dans une DataTable
    Par ruda.tom dans le forum JSF
    Réponses: 9
    Dernier message: 09/03/2007, 21h07
  4. [C#] Problème d'ajout d'une ligne dans une DataTable
    Par therock dans le forum Windows Forms
    Réponses: 3
    Dernier message: 09/11/2006, 08h27
  5. Ajout/Suppression dynamique des lignes dans une table
    Par codexomega dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/08/2005, 18h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo