Bonjour, voici un bout de mon code jsf
L'idée, c'est qu'a la selection d'un modele dans la premiere combobox, le second combo s'actualise et donne la liste d'article diponible pour le modele selectionné...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <h:selectOneMenu value="#{beanArticle.modele.nummod }" immediate="true" onchange="this.form.submit();" valueChangeListener="#{beanArticle.processValueChange }"> <f:selectItems value="#{beanArticle.modeleItems }" /> </h:selectOneMenu><h:outputLabel value="Modele"></h:outputLabel> <h:selectOneMenu value="#{beanArticle.article.numart }"> <f:selectItems value="#{beanArticle.articlesItems}"/> </h:selectOneMenu>
Voici le code qui peuple la premiere combo(fonctionnel)
le code du ValueChangeListener :
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 public void createListModeleItems(){ List<Modele>listmodele=(List<Modele>) proxy1.GetAllEntity(Modele.class, null); SelectItem s = new SelectItem(); s.setValue("0"); s.setLabel("Choix Modele"); modeleItems.add(s); for(Modele m:listmodele){ SelectItem sel = new SelectItem(); sel.setValue(m.getNummod()); sel.setLabel(m.getDsgmod()); modeleItems.add(sel); } } public List<SelectItem> getModeleItems() { this.modeleItems.removeAll(modeleItems); createListModeleItems(); return modeleItems; } public void setModeleItems(List<SelectItem> modeleItems) { this.modeleItems = modeleItems; }
L'entité modele est recupéré en BDD grace a son identifiant passé par le value du 1er Combobox.(modele possede ses getter/setter, il est instancié ds le constructeur, nummod est l'identifiant de l'entite modele)
Une liste de Composant est recupérée en BDD grace a l'entité modele precedemment retournée.
Une liste d'articles est créé grace a la liste de composants.
Une List<SelectItem>articlesItems est créée grace a la liste d'articles precedentes.
Cette List<SelectItem>articlesItems doit etre recupéré par le 2eme combobox...pour afficher les articles donc, en rapport avec le modele du 1er combobox.
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 public void processValueChange(ValueChangeEvent arg0) { if(this.modele.getNummod()!=null){ modele=(Modele) proxy1.GetEntity(modele, this.modele.getNummod()); @SuppressWarnings("unchecked") List<Composant>listComposant=(List<Composant>) proxy1.GetEntity(Composant.class, "modele", modele); List<Article>listArticle=new ArrayList<Article>(); articlesItems.removeAll(articlesItems); for(Composant c:listComposant) listArticle.add( c.getArticle()); if(!listArticle.isEmpty()){ for(Article a:listArticle){ SelectItem articleItem=new SelectItem(); articleItem.setValue(a.getNumart()); articleItem.setLabel(a.getDsgart()); articlesItems.add(articleItem); this.setArticlesItems(articlesItems); } } } }
Le souci, c'est que la liste d'article apparait bien mais pas au bon moment.
C'est a dire que lorsque l'utilisateur selectionne l'Item XXX dans la 1ere combo, rien ne se passe dans le second combo!
Ensuite l'utilisateur selectionne l'Item YYY et la liste en rapport avec l'ItemXXX apparait dans le second combo!!!!
Je crois que l'expression du second combo est evalué avant même que la methode "processValueChange" est passé la liste au setter d'ArticlesItems.
Si quelqu'un a reussi a me suivre jusque la, je le remercie par avance!!!!
Partager