UpdatePanel & Control

pierro01 Messages postés 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 4 mai 2009 - 19 févr. 2009 à 14:06
pierro01 Messages postés 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 4 mai 2009 - 24 févr. 2009 à 08:27
Bonjour,

J'ai une page contenant un ContentPlaceHolder dans lequel il y a un UpdatePanel dans lequel on trouve une GridView.
<ContentPlaceHolder id='CPH'>
   
       <GridView id='GV'>
   
</ContentPlaceHolder>

En gros j'essai de choper en aveugle (sans en connaitre le nom) un control.
Lorsque que je fais :
     (GridView)CPH.FindControl("GV")),
j'obtiens bien le control.

Par contre si je fais :
     (GridView)CPH.Controls.OfType<GridView>().First(),
je n'obtiens rien, personne au bout du fil.

Je ne me laisse pas démonter, je tente :
      UpdatePanel UP = (UpdatePanel)CPH.Controls.OfType().First(),
j'ai l'UpDatePanel, viens ensuite :
      (GridView)UP.ContentTemplate.Controls.OfType<GridView>().First(),
et là c'est le drame ... rien non plus !!!

Par contre
      (GridView)CPH.Controls.OfType<GridView>().First(),
fonctionne si je sors la GridView de l'UpdatePanel ...

Quelqu'un pourrait m'expliquer ????

9 réponses

pierro01 Messages postés 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 4 mai 2009
20 févr. 2009 à 15:10
Non ? personne ne viendra sur son cheval blanc me délivrer ? (faut que j'arrête les Disney moi).
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
20 févr. 2009 à 21:44
Bonjour,

as tu regardé la documentation de OfType ? cette méthode ne permet pas ce que tu veux ! (GridView)cph.FindControl("GV") est la seule solution. Cependant, je ne vois pas pourquoi tu utilises un FindControl.

<hr />Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant
0
pierro01 Messages postés 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 4 mai 2009
23 févr. 2009 à 11:05
Bonjour,

Merci pour ta réponse ...

J'ai besoin du FindControl parce que je suis dans une classe perso., pas dans le code de la page ...
L'utilisation du OfType aurait pu m'éviter de nommer les controls à utiliser, la règle étant : "tu prends le premier qui passe sans te soucier de son nom" !!!

Mais justement, dans la doc du <OfType> je ne vois pas pourquoi ça fonctionne en dehors de l'UpdatePanel et pas dedans !!!!

Cdt
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
23 févr. 2009 à 11:58
Si tu regardes la doc de OfType (http://msdn.microsoft.com/en-us/library/bb360913.aspx) ca te dit que cela te caste une collection en un autre type, si par exemple tu as un Object[] qui ne contient que des Person alors le OfType te retournera un IEnumerable. OfType fonctionne avec un curseur (yield return) puisque derriere tu fais un .First() tu ne cast que le premier element de ta collection. quand tu es dans l'updatePanel le premier élément que tu cast est le bon, quand tu es en dehors de l'updatepanel c'est pas le cas donc boom.

<hr />Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant
0

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

Posez votre question
pierro01 Messages postés 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 4 mai 2009
23 févr. 2009 à 13:11
Nous sommes d'accord, sauf sur la fin, dans mon exemple c'est même le contraire !

Je reprends mon premier schéma :
<ContentPlaceHolder id='CPH'>
   
       <GridView id='GV'>
   
</ContentPlaceHolder>
Si je fais :
UpdatePanel UP = (UpdatePanel)CPH.Controls.OfType().First();
(GridView)UP.ContentTemplate.Controls.OfType<GridView>().First();
la deuxième instruction plante.
Il trouve bien l'UpdatePanel dans le ContentPlaceHolder, mais pas le GridView dans l'UpdatePanel !!!

Si j'ai :
<ContentPlaceHolder id='CPH'>
    <GridView id='GV'>
</ContentPlaceHolder>
L'instruction :
(GridView)CPH.Controls.OfType<GridView>().First();
fonctionne !

Mais dans la doc de OfType je ne vois pas de restriction sur l'UpdatePanel.

Alors c'est un problème purement AJAX ????

En tout cas merci de ton aide.
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
23 févr. 2009 à 13:46
Ajax n'a rien à voir la dedans.

La méthode OfType n'est pas du tout fait pour ce que tu veux ! si tu veux récuperer le premier control, tu fais un .controls[0] puis un cast, si tu veux récuperer le premier controls de type gridview tu fais un .Where(c => typeof(c) == typeof(GridView)).First(); mais OfType ne sert pas à ca !

Regarde quelle est le premier controle de ContentTemplates.Controls et tu auras la réponse, je ne serais pas étonné de voir qu'il s'agisse d'un LiteralControl.

<hr />Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant
0
pierro01 Messages postés 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 4 mai 2009
23 févr. 2009 à 14:29
Ahhh tu vas trop vite pour moi !!!

T'as mis le doigt dessus, je veux récupérer la première gridview qui se trouve dans l'updatepanel.

Par contre je suis désolé mais je tu m'as perdu avec ton :
".Where(c => typeof(c) == typeof(GridView)).First();"

Tu l'aurais pas en version dummy ?

Merci
0
jesusonline Messages postés 6814 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 13 octobre 2010 29
23 févr. 2009 à 21:02
renseigne toi sur les lambda expression de C#3.

En C#2 ca s'écrit comme ca :

.Where(delegate(Control c){
    return typeof(c) == typeof(GridView);
}).First();

<hr />Cyril - MVP ASP.net - MCPD ASP.net & MCTS SQL - Consultant indépendant
0
pierro01 Messages postés 11 Date d'inscription mercredi 14 mars 2007 Statut Membre Dernière intervention 4 mai 2009
24 févr. 2009 à 08:27
OK, je me renseigne, si ça marche je t'épouse

Merci bien en tout cas
0