IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET Discussion :

[C# 2.0] encore un problème de usercontrol dynamique!


Sujet :

ASP.NET

  1. #1
    Membre éclairé Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Par défaut [C# 2.0] encore un problème de usercontrol dynamique!
    Bonjour à tous,

    Avant tout je tiens à précisé que j'ai bien lu tout les autres posts qui parlent de ce sujet! (en espérant avoir rien raté )

    Sur mon aspx j'ai deux ascx: le premier est 'statique', il est tout le temps chargé et affiché.
    Le second est dynamique je le charge sur le onit surchargé de mon aspx.

    La première difficulté c'est que l'affichage de l'ascx dynamique est contrôlé par une action effectuée sur le 1er ascx (en l'occurence, un click sur une image dans un gridview).
    Dans le code-behind du click, je renseigne une variable session.
    je test l'existence de la variable session sur le prerender de l'apx qui contient les 2 ascx. Si la variable est enseigné, je permet l'affichage de l'ascx, sinon je fais un .clear sur le placeholder.

    Cette partie là marche sans problème.

    Mon problème c'est de savoir comment initialiser les objets de mon ascx dynamique, qui dépendent du contenu de la variable session que je récupère sur le pre-render de l'aspx.

    ->la variable session est renseignée sur l'événement d'un objet de l'ascx statique, et la méthode qui renseigne la variable s'exécute après le form load de l'ascx dynamique.

    La solution que je vois c'est de gérer toutes les affectations et les appels de méthode sur les objets de mon ascx dynamique sur le prerender de l'aspx, mais c'est pas terrible, ca voudrait dire qu'il n'y aurait pas de code behind sur l'aspx dynamique, et bonjour le relecture du code!!

    En plus l'ascx dynamique va faire des POST, donc il faudrait aussi que je réaffecte le contenu de mon formulaires à partir du viewstate sur le pre-render de l'aspx...
    Voilà, ce qui m'embete c'est de gérer tout l'ascx dynamique à partir de pre-render de l'aspx.Tout ca c'est à cause de la récupération de cette foutu variable session que je ne peut pas récupérer avant(?).

    Et puis ca va forcément bloquer, vu que sur l'ascx dynamique j'ai un détail view qui fait des accès base par des méthodes statiques(objectdatasource), mais les paramètres de ces méthodes ne peuvent être connus qu'après le renseignement de la variable session.. or ca doit être vers le page load que l'objectdatasource fait les accès base, donc avant même que je connaisse les paramètres!

    ce qui serait pas mal c'est que j'arrive à récupérer par le viewstate les données POST des ascx avant leur form_load(donc de laisser tomber la session), mais d'après ce que j'ai compris, l'événement 'Raise PostBack Change' se passe après les form_load...

    voila voilà.. si quelqu'un veut bien s'arracher les cheveux avec moi c'est avec grand plaisir que je partagerais ma calvitie précoce.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Salut,

    Ce qu'il faut faire c'est :

    1) Dans le OnInit de ta page, vérifier l'existence ou non de ta variable de session. Si elle existe, charger dynamiquement ton second contrôle et l'ajouter a ton placeHolder, sinon ne rien faire.

    2) Qd il y a un clique de ton premier controle, le statique, il faut qu'il renseigne la variable de session, puis qu'il lève un évènement. Ta page doit s'abonner à l'évènement. Qd elle reçoit l'évènement, elle doit éventuellement supprimer le contenu du placeHolder et charger dynamiquement le second controle (de la même manière que dans le petit 1)

    De cette manière ton ascx dynamique n'est chargé que si ta variable de session existe. Donc au moment de son page_load tu es sur qu'il n'y a pas de problème, et tu n'as pas agérer manuellement un quelconque état, tu laisses faire le viewState.

    J'espère avoir répondu a ton problème, si ce n'est pas clair ou si je n'ai pas bien compris, n'hésite pas à me le dire.

  3. #3
    Membre éclairé Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Par défaut
    donc, si j'ai bien compris, je peux tester ma session sur le init au lieu du prerender, a condition d'abonner ma page à un événement.
    Je connais pas du tout cette histoire d'abonnement à des événements...
    ?
    En fait il y a quelque chose qui m'échappe:quel est l'intéret de lever un événement? si il est déclenché dans une méthode 'click' de l'ascx statique, quand, dans le cycle de vie de la page, le code lié à l'événement s'effectuera?
    (je croyais que les événements des contrôles se déroulaient après le form_load)

    Sinon oui, je pense que tu as bien cadré le problème.
    Et pour que le view state s'occupe du reste, il faut que je crée à la main tous mes controles dans le init de l'aspx c'est bien ca?
    J'ai remarqué que le detailview était connu sur le form_load de l'aspx dynamique sans avoir besoin de le créer dans l'init. par contre, j'ai du créer les contrôles à l'intérieur du detailview pour qu'ils soient connus sur le form_load de l'ascx.
    bizarre.

  4. #4
    Membre éclairé Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Par défaut
    bon j'ai regardé les delegate et tout le tralala, je vais essayer ca.
    Ca n'aurait pas été possible de gérer ca en implantant une interface avec juste une méthode?
    Sinon je ne sais toujours pas quand, dans le cycle de la page, la méthode liée à l'événement va s'exécuter??

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    donc, si j'ai bien compris, je peux tester ma session sur le init au lieu du prerender, a condition d'abonner ma page à un événement.
    Tu peux utiliser ta session n'importe qd dans le cycle de vie de ta page.

    Je connais pas du tout cette histoire d'abonnement à des événements...
    Va falloir regarder un peu , c'est qd même énormément utilisé dans .Net

    En fait il y a quelque chose qui m'échappe:quel est l'intéret de lever un événement? si il est déclenché dans une méthode 'click' de l'ascx statique, quand, dans le cycle de vie de la page, le code lié à l'événement s'effectuera?
    (je croyais que les événements des contrôles se déroulaient après le form_load)
    L'intéret de lever un évènement est simplement de prévenir qqun qu'un évènement a eu lieu. L'appel d'évènement est synchrone. Je pense que tu dois te documenter un peu sur ces évènements, j'ai l'impression que tu confonds plusieurs choses.

    Et pour que le view state s'occupe du reste, il faut que je crée à la main tous mes controles dans le init de l'aspx c'est bien ca?
    J'ai remarqué que le detailview était connu sur le form_load de l'aspx dynamique sans avoir besoin de le créer dans l'init. par contre, j'ai du créer les contrôles à l'intérieur du detailview pour qu'ils soient connus sur le form_load de l'ascx.
    La je ne comprends pas grand chose. Le seul controle que tu dois créer dynamiquement c'est ton second ascx, c'est tout.

  6. #6
    Membre éclairé Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Par défaut
    L'intéret de lever un évènement est simplement de prévenir qqun qu'un évènement a eu lieu. L'appel d'évènement est synchrone. Je pense que tu dois te documenter un peu sur ces évènements, j'ai l'impression que tu confonds plusieurs choses.
    tu m'as dit de lever un événement sur le click d'une ligne du gridview:

    2) Qd il y a un clique de ton premier controle, le statique, il faut qu'il renseigne la variable de session, puis qu'il lève un évènement. Ta page doit s'abonner à l'évènement.
    Ca, je l'ai fait.Le problème c'est que .net passe dans le click du contrôle statique (donc dans la méthode levé par mon événement, qui initialise les contrôles de l'ascx) après le form load de l'ascx dynamique. ->je ne peux donc pas affecter dans load de l'ascx dynamique des valeurs aux contrôles, car ils peuvent ne pas être créés.

    Dans l'état, cette façon de faire ne m'apporte donc rien par rapport à l'ancienne(tout gérer dans le pre_render)

    et je comprend pas cette histoire d'appel synchrone.

    Désolé, je dois te paraître un peu
    mais je suis toujours bloqué du coup.
    Ce qui aurait été interressant, c'est de séparer la création de l'ascx de son initialisation. laisser vide le cs de l'ascx dynamique c'est vraiment nul.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Si tu as suivi ce que j'ai marqué plus haut (les étapes 1 et 2) alors ça doit fonctionner, puisqu'a chaque clic sur ton controle "statique" tu vas recréer ton controle dynamique, et donc son page_load aura bien lieu aprés l'évènement clic.

  8. #8
    Membre éclairé Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Par défaut
    Je viens de vérifier. Effectivement, ca se passe comme ca.
    La création dynamique de l'ascx est OK, merci!!

    Il me reste à regler l'initialisation des mes composants et tout sera bon.
    (j'ai du foirer l'initialisation des contrôles, les labels et textbox qui sont sensées être dans mon detailview s'affiche en fait en dehors.)

    je mettrais le tag résolu quand j'aurais gérer les POST et tout


  9. #9
    Membre éclairé Avatar de gdkenny
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 251
    Par défaut
    le problème du chargement de l'ascx dynamique est OK, mais je n'arrive pas à afficher les labels liés à mes textbox dans le detailsview qui est dans l'ascx dynamique...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Programmer encore en VB 6 c'est pas bien ? Pourquoi ?
    Par Nektanebos dans le forum Débats sur le développement - Le Best Of
    Réponses: 85
    Dernier message: 10/03/2009, 14h43
  2. TEdit (encore)
    Par dj.motte dans le forum C++Builder
    Réponses: 5
    Dernier message: 23/12/2002, 19h02
  3. TPalette (encore)
    Par Flipper dans le forum Langage
    Réponses: 3
    Dernier message: 28/11/2002, 23h45
  4. ListView->Items->Clear() !!! Qques probl de perf
    Par Nicolas_a69 dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/08/2002, 11h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo