DropDownList et DataSource d'objets

Résolu
Alexandre Marlot Messages postés 18 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 1 mai 2008 - 13 avril 2007 à 20:26
Alexandre Marlot Messages postés 18 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 1 mai 2008 - 15 avril 2007 à 13:00
Bonjour.

Je désire alimenter une DropDownList à partir d'une collection d'objet. Je réalise pour cela un binding avec les propriété value et text (afin d'avoir un affichage correct). Tout cela marche très bien.

Lorsque j'affecte mon dataSource, j'affecte une collection d'objet qui contienne plusieurs property(nom,prenom, age ...) . J'aimerais pouvoir récupérer ses property lorsque par exemple on selectionne une ligne de cette dropdownlist afin de les afficher directement (sans les rechargées !). Je n'ai pas réussis à obtenir mes objets que j'avais affecté lors du binding.
Il n'existe pas de : monDropDownList.selectedItem.getObject() :(((( (ou équivalent).

J'espère avoir été clair :)
Si ce que je veux faire n'est pas possible, comment dois je faire proprement ce genre de chose ?

Merci d'avance
Alexandre

10 réponses

cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
14 avril 2007 à 19:18
Salut,
N'oublies pas que le web fonctionne en mode déconnecté : ASP.NET ne conserve rien entre 2 postback !
Ou plutôt, il ne conserve (dans le ViewState) que le contenu de la DropDownList, donc pas tout ton objet mais juste un String.
Dans ton cas je vois deux possibilités :
- Soit tu stockes toutes tes données en Session, pour éviter une grosse requête au PostBack.

- Soit tu voies ça différement, c'est ta première requête qui ne va pas :
Lorsque tu remplies ta DropDownList, tu n'as pas besoin d'avoir derrière une collection d'objets, juste une liste des noms des personnes (si l'objet représente une personne...) ou d'un autre champ. Et ensuite au postback, là tu fais une requête pour séletionner uniquement l'objet complet correspondant à ce nom là.

C'est de loin cette deuxième solution que je conseillerais car, dans le 1er cas, tu charges une collection de pleins d'objets alors que tu ne cherches qu'à avoir une liste de noms à afficher, et qu'en plus après tu n'en affichera qu'un seul, celui qui sera choisit par la DropDownList. Ce qui te fait charger pleins d'objets en mémoire pour rien... et ensuite tous te les trimballer dans une variable de Session...

A++

<hr width="100%" size="2" />Nurgle (Antoine) - MSP
3
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
14 avril 2007 à 23:02
De rien

Pour ton autre question, effectivement la DropDownList ne prend en paramètre qu'un seul champ...
C'est là que les types anonymes seraient bien utiles, mais bon... il faudra attendre C# 3 pour ça
Je vois 3 solutions :

- Soit tu ne veux pas modifier tes classes métiers, ce qui est effectivement le plus sage , dans ce cas crée une nouvelle List<String> et fait une boucle sur ta collection d'objet, et ajoute pour chaque objet un String contenant Nom + Prénom, et tu bind cette liste à la DropDownList.

- Soit tu peux modifier ta classe métier, dans ce cas effectivement, rajouter une propriété fonctionnerait.

- Sinon, il y a une ruse  : Overrider le .ToString() pour le faire renvoyer Nom + Prénom, et ensuite tu laisses DataTextField vide, et je pense (à vérifier, mais je suis presque sûr) qu'il va ainsi appeller .ToString() sur tes objets, ne sachant pas quoi en faire
(C'est toujours pratique, surtout que tu peux réutiliser ce .ToString() autre part pour afficher directement Nom + Prénom, sans avoir de propriété supplémentaire... De plus Visual Studio, si jamais tu vois un jour un de tes objets en pas à pas ou en mode débug, t'affichera directement le Nom + Prénom, plutôt que le type de l'objet, c'est toujours pratique)

Mais bon, c'est vrai... la méthode la plus respectueuse du n-tiers reste la première ;)

<hr width="100%" size="2" />Nurgle (Antoine) - MSP
3
cs_makito Messages postés 47 Date d'inscription mardi 31 octobre 2000 Statut Membre Dernière intervention 21 février 2008
14 avril 2007 à 13:12
Utilise un tableau public de tes objets
0
Alexandre Marlot Messages postés 18 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 1 mai 2008
14 avril 2007 à 13:32
Bonjour.

J'y avais bien pensé mais il faut que je déclare le tableau en static si mes souvenirs sont bon non ? (car sinon le tableau est remis à null à chaque PostBack ...)

De plus, si je met en static cela veut dire que le tableau contiendra les mêmes données pour toutes les instances de la page ! Ce qui veut dire que tous le monde aura les mêmes données.

Je me trompe ou pas ?

Alex
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_makito Messages postés 47 Date d'inscription mardi 31 octobre 2000 Statut Membre Dernière intervention 21 février 2008
14 avril 2007 à 13:53
as tu beaucoup de données? sinon tu peux utiliser les sessions
0
Alexandre Marlot Messages postés 18 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 1 mai 2008
14 avril 2007 à 15:48
Non je n'ai pas énormement de données. c'est donc une solution envisageable...

C'est pas un peu lourd pour si peu de chose ?

Il n'y a pas d'autre technique ? (meme si cela n'a rien avoir avec ma proposition initial ) ?

En tout cas merci ;)
Alex
0
Alexandre Marlot Messages postés 18 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 1 mai 2008
14 avril 2007 à 21:52
Oki merci pour cette explication détaillée et très instructive !
Je voulais etre sur que ASP.NET ne sauvegardé que le contenu de la dropdownlist et non tous mes objets !

Je vais donc a partir de maintenant réaliser tous mes dévellopements à partir de la 2eme méthodes !

Merci beaucoup pour ton aide.
Alex

Dans le même esprit j'en profite pour poser une autre question.
Imaginons que je veille affiché deux champs dans le DataTextField : Nom et prenom.
Je peux faire ca au niveau du Binding ?
Bien sur une solution c'est de faire une property au niveau de ma source de donnée qui concatene le nom et le prenom ...

Mais si on veut faire du N-Tiers, logiquement c'est le role de la GUI :)

Enco
0
Alexandre Marlot Messages postés 18 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 1 mai 2008
14 avril 2007 à 23:38
Merci encore une fois pour cette explication pationnante :)

De loin la solution 1 est la meilleur ! Mais très fastidieuse :( Ca fait redéclarer des variables ... refaire des parcours de boucle ... c'est pas terrible ... J'aime bien les choses carrées ;)
Et puis ma boite me donne pas des années pour faire mes programmes lol

c'est vrai que l'astuce du toString () est pas bete mais c'est un peu du bidouillage lol ...

Bref sur ce point précis .NET est pas terrible :) JAVA en architecture J2EE on peux faire ce genre de truc facilement (sans dataBinding forcement !)

Il aurait pu prévoir ce cas chez Microsoft quand meme loool c'est bidon comme truc lol ...

Bref je vais réfléchir à tous ca pendant la fin de mon week-end lol :)

En tous les cas tu as l'air de bien connaitre le sujet et les architectures N-Tiers !
MSP Powa :))))

Alex
PS : Je n'hésiterai pas à reposter des questions sur .NET (plus du coté architecture N-tiers :))
0
cs_Nurgle Messages postés 1642 Date d'inscription samedi 6 novembre 2004 Statut Membre Dernière intervention 28 avril 2011 4
15 avril 2007 à 12:43
Je cite quand même une dernière possibilité :
Ne pas utiliser le DataBinding ! Tu fais une boucle sur tes objets, et ajoute pour chaque item un Item dans la DropDownList qui contiendra Nom + Prénom...
(J'étais tellement dans le problème du DataBinding que j'ai pas eu l'idée de faire sans...)
Cette solution là me parait de loin la plus simple à mettre en place.

PS : n'hésite pas à poser des questions, on est là pour ça ^^

<hr width="100%" size="2" />Nurgle (Antoine) - MSP
0
Alexandre Marlot Messages postés 18 Date d'inscription vendredi 13 avril 2007 Statut Membre Dernière intervention 1 mai 2008
15 avril 2007 à 13:00
Exact c'est pas bête :)

C'est vrai que moi aussi j'étais tellement dans le DataBinding que j'y ai pas pensé ! C'est pour cela que avoir l'avis d'autres personnes c'est super important :) Avoir de l'abstraction lol

Je vais certainement faire ca ...

C'est quand meme dommage que l'un des interets de .NET ca soit le DataBinding (que Microsoft) vente pas mal et que on puisse pas l'utilisé lol.

Bonne fin de week à toi et encore merci :)
Je n'hesiterai pas à revenir si j'ai des questions ...

Alex
0
Rejoignez-nous