locked
Comment afficher une liste déroulante dans le détail d'une donnée? RRS feed

  • Question

  • Bonjour,

    Je vous expose le truc :

    J'ai en fait une table document qui a plusieurs clés étrangères. Je voudrais afficher dans le détail d'un document un combobox pour chaque clé etrangère. Quand je drag and drop de mes sources de données ça marche mais à l'éxecution ça m'affiche bien les combobox remplies mais avec tous les documents. C-a-d que si 10 documents sont de TypeSujet = "Eau" la combobox typesujet va m'afficher 10 fois "eau".

     

    mardi 20 juillet 2010 23:15

Réponses

  • Merci de tes précisions, on y voit plus clair.

    C'est à la fois au niveau contexte que cela ne va pas et au niveau binding. Le DataContext du détail c'est une classe détail voire la liste elle-même dans ton cas (il faudrait voir test bindings). Si cette classe possède un "type de document", en bindant la combobox dessus, tu trouveras normalement le type de document de l'élément en cours. Mais une combobox n'est pas un simple Textbox... Il y a d'une part la donnée affichée et ensuite la liste des éléments propres à la combo.

    Si tu bindes tout ça à la liste, normal que la combo retourne la liste source (tous les documents) et non pas toutes les valeurs possibles pour un type de document...

    Pour cela il faut que ta base et ton modèle expose la liste des documents et que tu bindes la combo, pour sa partie liste, à cette source bien particulière de données, sinon la combo ne peut pas deviner quels sont les types possibles. Même si elle avait cette "intelligence" comme tu filtres la liste, elle ne pourrait au mieux que trouver 1 seul type de document, celui qui a servi a filtrer...

    Il faut donc que cette information soit dissociée de la liste des documents que tu remontes, seule une requête sur la base de données peut donner tous les types possibles : soit parce que, ce qui serait le mieux, ton schéma de base de données possède une table des types de document; soit si ton schéma ne propose pas une telle table il expose au minimum une vue crée à partir select distcint sur tous les champs "type de document". C'est cette table ou cette vue qui doit être remontée dans le modèle Entity Framework et c'est à cette liste que la source de la liste de la combo doit être reliée.

     


    Olivier Dahan Dot.Blog : www.e-naxos.com/blog
    jeudi 22 juillet 2010 01:26

Toutes les réponses

  • Il faudrait que tu sois un tout petit peu plsu précis. D'où viennent les données, comment sont-elles affichées (quel objet), utilises-tu un DataTemplate, peux-tu le faire voir, etc ... ?
    Olivier Dahan Dot.Blog : www.e-naxos.com/blog
    mardi 20 juillet 2010 23:38
  • Bonjour,

    J'ai crée un projet Business Application (silverlight). J'ai donc 2 projets dans ma solution (avec VS2010). Dans mon premier projet j'ai mis pour acceder aux données Entity Framework 4 et pour communiquer avec l'interface utilisateur j'ai mis une classe domaineservice. Dans le deuxieme projet (silverlight 4), quand on ouvre une page.xaml, vs2010 nous propose les sources de données que j'ai exposé (avec la classe domainservice) dans le premier projet. J'ai donc glissé et déposé une datagrid de "document" (IdDocument, Intitule, IdTypeDocument) apres j'ai parametré ma source de données "document" pour qu'elle s'affiche plutot en détail qu'en datagrid. J'ai glissé et déposé et quand je séléctionne une ligne dans ma datagrid cela me bind directement sur le détail l'élément selectionné (c'est bon ça marche!). Maintenant, dans le détail j'avais configurer dans la source de données exposé par le Domainservice que l'objet "typedocument" de "Document" pour qu'il soit en fait une combobox pour que je puisse modifier le type du document selectionné dans la datagrid. Le probleme c'est que cette combobox de "type document" m'affiche 10 fois "typedocument"="rapport de stage" parce que j'ai 10 documents qui sont de type rapport de stage et en plus quand je veux modifier le type document je selectionne un document. C'est une histoire de binding et de datacontext mais je n'y arrive pas, ...., ou peut être que ça ne se fait pas, je ne sais pas, ...

     

    mercredi 21 juillet 2010 08:32
  • Merci de tes précisions, on y voit plus clair.

    C'est à la fois au niveau contexte que cela ne va pas et au niveau binding. Le DataContext du détail c'est une classe détail voire la liste elle-même dans ton cas (il faudrait voir test bindings). Si cette classe possède un "type de document", en bindant la combobox dessus, tu trouveras normalement le type de document de l'élément en cours. Mais une combobox n'est pas un simple Textbox... Il y a d'une part la donnée affichée et ensuite la liste des éléments propres à la combo.

    Si tu bindes tout ça à la liste, normal que la combo retourne la liste source (tous les documents) et non pas toutes les valeurs possibles pour un type de document...

    Pour cela il faut que ta base et ton modèle expose la liste des documents et que tu bindes la combo, pour sa partie liste, à cette source bien particulière de données, sinon la combo ne peut pas deviner quels sont les types possibles. Même si elle avait cette "intelligence" comme tu filtres la liste, elle ne pourrait au mieux que trouver 1 seul type de document, celui qui a servi a filtrer...

    Il faut donc que cette information soit dissociée de la liste des documents que tu remontes, seule une requête sur la base de données peut donner tous les types possibles : soit parce que, ce qui serait le mieux, ton schéma de base de données possède une table des types de document; soit si ton schéma ne propose pas une telle table il expose au minimum une vue crée à partir select distcint sur tous les champs "type de document". C'est cette table ou cette vue qui doit être remontée dans le modèle Entity Framework et c'est à cette liste que la source de la liste de la combo doit être reliée.

     


    Olivier Dahan Dot.Blog : www.e-naxos.com/blog
    jeudi 22 juillet 2010 01:26
  • Re,

    ça y est j'utilise maintenant la methodologie mvvm.

    vendredi 23 juillet 2010 03:33