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 :

Accès au contrôle de la page en CodeBehind C#


Sujet :

ASP.NET

  1. #1
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut Accès au contrôle de la page en CodeBehind C#
    Bonjour à tous.

    Je me trouve confronté à un problème basique mais j'ai du mal à comprendre où je me suis planté n'étant aps encire trés familier avec la syntaxe du C# (parce que je crois que le problème vient de là).

    Donc j'ai une page avec ce code côté HTML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" MasterPageFile="~/MasterPage/Default.master" EnableEventValidation="false" Culture="fr-FR" EnableViewState="true" %>
    <asp:Content ID="cHeader" runat="server" ContentPlaceHolderID="cphHeader"></asp:Content>
    <asp:Content ID="cEntete" ContentPlaceHolderID="cphEnTete" Runat="Server"></asp:Content>
    <asp:Content ID="cGauche" ContentPlaceHolderID="cphGauche" Runat="Server"></asp:Content>
    <asp:Content ID="cCentral" ContentPlaceHolderID="cphCentral" Runat="Server"></asp:Content>
    <asp:Content ID="cDroite" ContentPlaceHolderID="cphDroite" Runat="Server"></asp:Content>
    <asp:Content ID="CPied" ContentPlaceHolderID="cphPied" Runat="Server"></asp:Content>
    Donc en gros que des ContentPlaceHolder qui font référence à ceux placés dans la MasterPage.

    Dans mon CodeBehind j'ai mis cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    protected void Page_Init(object sender, EventArgs e)
        {
            if (Request.QueryString["valhalla"] == "loki")
            {
                Label lblMaintenance = new Label();
                lblMaintenance.Text = "Le site est actuellement en maintenance. Veuilez nous excuser pour la gêne occasionnée";
                this.Page.FindControl("cCentral").Controls.Add(lblMaintenance);
            }
    }
    Le truc est simple : si la QueryString est comme cela, il faut afficher une Label qui dit que le site est en maintenance.
    Mais à l'éxécution de la page il me dit :
    La référence d'objet n'est pas définie à une instance d'un objet.
    Sur la ligne qui fait le Controls.Add.

    Alors deux choses :
    - j'ai du mal à comprendre où il veut que je fasse un new puisque le ContentPlaceHolder est dans la page, côté HTML
    - je n'ai pas réussi à y accéder directement au ContentPlaceHolder, en tapant son identifiant.

    Aurais je loupé un détail ?

  2. #2
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Et ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cCentral.Controls.Add(lblMaintenance)

  3. #3
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Salut LuteceFalco

    Alors j'ai essayé ton idée, mais je n'ai rien dans l'intellisense.
    J'ai poussé jusqu'à écrire tout à la main mais il me souligne cCentral en rouge et me dit :
    Erreur 2 Le nom 'cCentral' n'existe pas dans le contexte actuel D:\inetpub\SystemC\Default.aspx.cs 70 13 http://www.systemc.maison/
    C'est ça que je ne comprends pas. En VB ça marche direct et là, ça marche pas.

    Par contre si je met une TextBox dans un CPH, j'y accède sans problème.

    Je sèche.

  4. #4
    Membre confirmé Avatar de Yosko
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2008
    Messages : 61
    Par défaut
    Je ne sais pas trop pourquoi c'est possible en VB... Mais la doc msdn semble indiquer que :
    A Content control is not added to the control hierarchy at runtime. Instead, the contents within the Content control are directly merged into the corresponding ContentPlaceHolder control.
    Ce qui expliquerait qu'il ne soit pas accessible depuis le code behind.

  5. #5
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.FindControl("cphCentral");
    cph.Controls.Add(txt);

  6. #6
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    J'avoue, je ne suis pas allé dans la MSDN, faisant le truc naturellement en VB je ne me suis pas posé de question plus que ça.
    Enfin, j'ai un doute car je ne le fait pas tout à fait comme ça en VB, je passe par un classe alors que la je suis direct dans ma page. C'est peut-être ça qui change.

    Bon en tout cas LuteceFalco, le grand sauveur, comme d'habitude, aller le chercher dans la Master, fallait y penser.
    ça marche !!!

    Merci

  7. #7
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    J'aime bien tes posts car ils me font réviser des trucs et c'est très bien.

    Pour le coup, c'est vrai que c'est un poil alambiqué. Tu peux jeter un oeil ici: http://www.west-wind.com/weblog/post...nd-FindControl

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  8. #8
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    oops, j'ai bouclé trop vite.

    Question subsidiaire qui n'a rien à voir : c'est quoi la commande pour sortir du Page_Init ?

    J'explique avec le code que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    protected void Page_Init(object sender, EventArgs e)
        {
            if (Request.QueryString["valhalla"] == "loki")
            {
                Label lblMaintenance = new Label();
                lblMaintenance.Text = "Le site est actuellement en maintenance. Veuilez nous excuser pour la gêne occasionnée";
                ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.FindControl("cphCentral");
                cph.Controls.Add(lblMaintenance);
            }
         }
    Aprés ce code je vais mettre d'autre truc à faire. Mais je voudrais que si le programme passe dans le if il sorte à la fin, aprés l'ajout du contrôle et qu'il n'éxécute pas ce qu'il y aura aprés le if.
    J'avoue, même en VB je sais pas le faire.

  9. #9
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par lutecefalco Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.FindControl("cphCentral");
    cph.Controls.Add(txt);
    Là où cela se corse c'est qu'il faut l'ajouter au contrôle "cCentral" (ou cela ne change rien?).
    "Winter is coming" (ma nouvelle page d'accueil)

  10. #10
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    J'aime bien tes posts car ils me font réviser des trucs et c'est très bien.

    Pour le coup, c'est vrai que c'est un poil alambiqué. Tu peux jeter un oeil ici: http://www.west-wind.com/weblog/post...nd-FindControl

    A+
    Merci immobilis, ça me fais plaisir de servir à quelque chose.
    A vrai dire, cela prendra tout sa splendeur quand j'aurais fini le premier bout car, comme j'ai dit dans certains post, je vais publier ça sur mon blog et donner cadeau tout le système à ceux qui liront.

    En ce moment, mon projet de Web Agency est au point mort, je trouve pas un seul client, c'est la mouise, donc je m'occupe en essayant d'aider mon prochain.
    J'ai même été sollicité pour intégrer l'équipe des rédacteurs mais je n'ai pas trop de nouvelles ou alors j'ai loupé un truc, pas grave, je vais relire ce qu'il faut.
    Je voudrais finir le corps de mon système avant, histoire de l'avoir dans les deux langages et le donner en pature aux développeurs.

    Bref, voilà, si je sers à quelquechose, je suis content.

    Merci

  11. #11
    Membre confirmé Avatar de Yosko
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2008
    Messages : 61
    Par défaut
    Ah tiens, je suis preneur. Merci pour l'info Immobilis

    Citation Envoyé par Immobilis Voir le message
    J'aime bien tes posts car ils me font réviser des trucs et c'est très bien.
    Je plussoie ce point. Venant comme zooffy d'un univers VBA (et C++), je débute C#, et tous ses postes m'apprennent des trucs

  12. #12
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    Là où cela se corse c'est qu'il faut l'ajouter au contrôle "cCentral" (ou cela ne change rien?).
    Non, non, ça, ça marche bein, le label s'ajoute trés tranquillement dans le CPH cCentral. C'est juste le cheminement un peu complexe d'aller le rechercher dans la Master qui est scabreux alros que les autres contrôles sont accessibles directement. Mais à la lumière de ton lien (avec du mal, l'anglais et moi....) j'ai compris le truc.
    Le ContentPlaceHolder est un contrôle un peu particulier visiblement. De ce que j'ai compris il est en deux parties, l'une dans une Master et l'autre dans la page, mais cette partie n'est qu'une "référence" au socle de base qui est dans la Master.

    En tout cas c'est super pratique comme truc, surtout que j'exploite ça à fond dans mon système.

  13. #13
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    L'ajout dynamique de contrôles est un peu risqué. Je n'aime pas la méthode FindControl car je me dis qu'en programmation il faut savoir où se trouvent les objets et si on n'arrive pas à les atteindre, c'est qu'on ne le fait pas au bon endroit. Bref, je prend cette méthode comme quelque chose de pas propre. On ne peut pas profiter des vérifications du code à la compilation d'où erreur potentielle.

    Perso j'aurais ajouté manuellement mon contrôle depuis le designer dans le contenu et pas le placeholder. Là il devient accessible et j'aurais joué sur la visibilité et/ou sur le contenu du message.

    S'agissant d'un message de maintenance pourquoi pas une page ou un usercontrol dédié?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  14. #14
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Je vois ce que tu veux dire mais il y a deux choses (par rapport à mon système) :
    - l'ajout dynamique des contrôles est la base de mon système, donc je joue avec obligatoirement. Mais je contrôle tout en amont.
    - une fois que la MasterPage est accrochée tu ne peux pas mettre de contrôle en dehors des CPH.

    Sinon, je sens que ma question subisidiaire est passée à la trappe : c'est quoi la commande pour sortir du Page_Init, un Exit tout bête ?

  15. #15
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par zooffy Voir le message
    Je vois ce que tu veux dire mais il y a deux choses (par rapport à mon système) :
    - l'ajout dynamique des contrôles est la base de mon système, donc je joue avec obligatoirement. Mais je contrôle tout en amont.
    Je comprend, mais de mon point de vu un objet ne devrait pas "décider" comment un autre doit se comporter mais juste lui transmettre des infos. La page ne devrait pas faire de truc du genre: telle URL alors je cherche depuis ma master page où se trouve tel contrôle pour lui dire de charger un label et d'y mettre le texte que je veux. Cela indique que la classe "_Default" a connaissance du contenu d'autres classes. Il me semble que c'est contraire au bonnes pratiques de la programmation objet qui considère les objets comme des boîtes noir car encapsulant le code.

    A mon avis, ce que peut faire la page c'est transmettre l'URL au contenu "cCentral" qui décide quel contrôle il va charger. Cela donnerait: "ah, je reçois cette URL donc je charge le contrôle utilisateur 'Maintenance.ascx' ou bien 'Produit.ascx'".

    J'ai un peu de mal à voir où cela va te mener à part vers un code difficile à maintenir.
    Citation Envoyé par zooffy Voir le message
    Page_Init, un Exit tout bête ?
    C'est d'une certaine manière une illustration de ce que je viens de dire. Pourquoi intervenir sur le cycle de cette façon? C'est simplement A+
    "Winter is coming" (ma nouvelle page d'accueil)

  16. #16
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Je comprends trés bien ce que tu dis là, mais un CMS (le système que je fabrique) fonctionne exactement à l'inverse de ta description, enfin, de ce que j'en ai vu.

    L'idée est de permettre à un utilisateur lambda, qui ne connait rien en programmation, de fabriquer lui même son site web à partir d'outil mis à sa disposition.
    Du coup, tu vas stocker en BDD des infos que tu iras chercher selon la programmation que tu as mis dans le contrôle utilisateur prévu.
    Mais l'utilisateur lui ne verra qu'une liste déroulante lui présentant les "contrôles" mis à sa disposition et ensuite un formulaire pour remplir les éléments du dit contrôle.

    Là, dans le cas qui m'occupe, c'est autre chose.
    J'ai pas voulu faire un Maintenance.ascx par fainéantise, tout simplement.
    Je me suis dit qu'un simple label avec un message clair c'était suffisant.
    Mais pour le reste tout passe par des ASCX chargés dans les CPH. Mais ça, c'est pour plus tard. Là, je contrôle les base de l'ouverture du site, de l'existance de la page et des autorisations des visiteurs. Tu verra quand je publierais dans mon blog, tu auras toutes les réponses et tes critiques seront vivement attendues.

    Quant à l'interuption du cycle, c'est juste par sécurité, pour être sûr que ça va bien sortir de la procédure, même si mon code actuel le prévois déjà, je veux juste faire "ceinture ET bretelle"

    Alors, c'est quoi cette commande magique ?

  17. #17
    Expert confirmé
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    C'est simplement A+
    "Winter is coming" (ma nouvelle page d'accueil)

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/01/2007, 16h05
  2. [C#] Accès à un contrôle depuis un autre controle
    Par Gloups dans le forum Windows Forms
    Réponses: 6
    Dernier message: 16/08/2006, 18h46
  3. Réponses: 3
    Dernier message: 09/06/2006, 15h41
  4. [Rico] Accès aux éléments de la page de manière bizarre
    Par dodik dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 22/02/2006, 17h35
  5. [EasyPHP] [Directives] accés sous réseau pour ma page PHP
    Par StyleXP dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 14
    Dernier message: 21/01/2006, 18h57

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