DropDownList et DataSource d'objets [Résolu]

Alexandre Marlot 18 Messages postés vendredi 13 avril 2007Date d'inscription 1 mai 2008 Dernière intervention - 13 avril 2007 à 20:26 - Dernière réponse : Alexandre Marlot 18 Messages postés vendredi 13 avril 2007Date d'inscription 1 mai 2008 Dernière intervention
- 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
Afficher la suite 

Votre réponse

10 réponses

cs_Nurgle 1648 Messages postés samedi 6 novembre 2004Date d'inscription 28 avril 2011 Dernière intervention - 14 avril 2007 à 19:18
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Nurgle
cs_Nurgle 1648 Messages postés samedi 6 novembre 2004Date d'inscription 28 avril 2011 Dernière intervention - 14 avril 2007 à 23:02
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Nurgle
cs_makito 47 Messages postés mardi 31 octobre 2000Date d'inscription 21 février 2008 Dernière intervention - 14 avril 2007 à 13:12
0
Utile
Utilise un tableau public de tes objets
Commenter la réponse de cs_makito
Alexandre Marlot 18 Messages postés vendredi 13 avril 2007Date d'inscription 1 mai 2008 Dernière intervention - 14 avril 2007 à 13:32
0
Utile
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
Commenter la réponse de Alexandre Marlot
cs_makito 47 Messages postés mardi 31 octobre 2000Date d'inscription 21 février 2008 Dernière intervention - 14 avril 2007 à 13:53
0
Utile
as tu beaucoup de données? sinon tu peux utiliser les sessions
Commenter la réponse de cs_makito
Alexandre Marlot 18 Messages postés vendredi 13 avril 2007Date d'inscription 1 mai 2008 Dernière intervention - 14 avril 2007 à 15:48
0
Utile
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
Commenter la réponse de Alexandre Marlot
Alexandre Marlot 18 Messages postés vendredi 13 avril 2007Date d'inscription 1 mai 2008 Dernière intervention - 14 avril 2007 à 21:52
0
Utile
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
Commenter la réponse de Alexandre Marlot
Alexandre Marlot 18 Messages postés vendredi 13 avril 2007Date d'inscription 1 mai 2008 Dernière intervention - 14 avril 2007 à 23:38
0
Utile
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 :))
Commenter la réponse de Alexandre Marlot
cs_Nurgle 1648 Messages postés samedi 6 novembre 2004Date d'inscription 28 avril 2011 Dernière intervention - 15 avril 2007 à 12:43
0
Utile
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
Commenter la réponse de cs_Nurgle
Alexandre Marlot 18 Messages postés vendredi 13 avril 2007Date d'inscription 1 mai 2008 Dernière intervention - 15 avril 2007 à 13:00
0
Utile
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
Commenter la réponse de Alexandre Marlot

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.