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éder à un Div dans un composant utilisateur à partir d'un autre composant utilisateur


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éder à un Div dans un composant utilisateur à partir d'un autre composant utilisateur
    Bonjour tout le monde.

    Là, je suis confronté à un souci d'accés. Je dois me gourrer de pas grand chose, mais je suis paumé ! Je vais essayer de présenter la chose de la manière la plus simple, mais le système est complexe par lui même. Je vais mettre des morceaux de code en espérant pas trop sabrer tout en essayant de ne pas trop tartiner.

    D'abord la page côté HTML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <%@ Page Title="" Language="VB" MasterPageFile="~/MasterPage/Generale.master" AutoEventWireup="false" CodeFile="DetailGig.aspx.vb" Inherits="Navigation_DetailGig" %>
     
    <asp:Content ID="Content1" ContentPlaceHolderID="cphHead" Runat="Server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="cphEntete" Runat="Server">
        <Composite:MenuNav ID="menu" runat="server" />
    </asp:Content>
    <asp:Content ID="Content3" ContentPlaceHolderID="cphGauche" Runat="Server">
        <Composite:DetailGig ID="DetailGig" runat="server" />
    </asp:Content>
    <asp:Content ID="Content4" ContentPlaceHolderID="cphCentral" Runat="Server">
        <Composite:ListeCategorieGig ID="listeCateg" runat="server" />
    </asp:Content>
    <asp:Content ID="Content5" ContentPlaceHolderID="cphPied" Runat="Server">
    </asp:Content>
    Elle est liée à une MasterPage, donc trés classique. Je n'ai pas de CodeBehind.

    Ensuite, dans le composant utilisateur MenuNav j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <ajax:UpdatePanel ID="upSing" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional">
        <Triggers>
            <ajax:AsyncPostBackTrigger ControlID="lbSign" EventName="Click" />
        </Triggers>
        <ContentTemplate>
            <div id="divFondSign" runat="server" style="display:none;" class="FondOpaque">
            <div id="divDevantSign" class="DivSignIn">
            <asp:LinkButton ID="lbCloseLogin" runat="server" Text="Close"></asp:LinkButton>
            <asp:Login ID="logC" runat="server" ></asp:Login>
            </div>
            </div>
        </ContentTemplate>
    </ajax:UpdatePanel>
    Ce code permet d'avoir un lien en haut de page pour se loguer. Si on clique, la page devient opaque et une mire de connexion apparait. On entre ce qu'il faut et on est connecté.

    Et dans le composant DetailGig j'ai un lien sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <asp:LinkButton ID="lbContact" runat="server"></asp:LinkButton>
    Et le CodeBehind suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        Protected Sub lbContact_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lbContact.Click
            If Profile.IsAnonymous Then
                Dim div As HtmlControls.HtmlControl = Page.FindControl("divFondSign")
                div.Style("Display") = "Block"
            Else
                Response.Redirect("~/Navigation/Contact.aspx?id=" & IdGig)
            End If
        End Sub
    L'idée est de tester si l'utilisateur est connecté ou pas avant de pouvoir faire un contact à un aute utilisateur.

    Mon souci arrive sur la ligne où je tente un accès au Div et le serveur me dit :
    La référence d'objet n'est pas définie à une instance d'un objet.
    Ce que je peux comprendre. Sauf que je ne trouve pas le moyen de pointer vers le Div qui se trouve dans le composant MenuNav.
    En gros, de ce que j'ai compris de mes investigations, c'est dans l'arborescence des contrôles que je me paume, mais quel est le bon chemin ?

    Voilà, si vous pouvez m'aider, c'est cool.

  2. #2
    Membre chevronné Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Par défaut
    Bonjour,

    L'erreur arrive sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim div As HtmlControls.HtmlControl = Page.FindControl("divFondSign")
    ?

  3. #3
    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
    Ton composant MenuNav doit exposer une propriété ReadOnly correspondant à l'ID de ta div.

    Ton composant DetailGig doit exposer une propriété DivId qui sera setté par ta page avec la valeur MenuNav.DivId (dans le Page_Load par exemple)

    Ainsi, dans le code behind de DetailGig, tu te serviras de cette propriété pour retrouver ta div.

  4. #4
    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
    @ Jacky01 : non, la ligne d'en dessous

    @ LuteceFaclo : j'ai pas tout compris, mais je vais essayer de mettre en place ce que tu dis.

    @ tous les deux : MERCI

  5. #5
    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 confirme : j'ai rien compris !

    Alors premier problème : comemnt on fait une propriété ReadOnly ?
    Ensuite : quel type je lui donne ? Parce que String, visiblement, ça marche pas bien.
    Egalement, setter la propriété d'un composant sur l'autre, j'ai du mal à suivre, certainement parce que je vois pas bien le type de la chose.

    Enfin, une fois dans le code, pendant le test du Porfil j'appelle quoi ? La propriété directement ou je fabrique nue objet qui sera mon DIV ?

    Désolé de pas arriver à suivre mais là, ça fait appel à des notions qui me manque, je crois.

  6. #6
    Membre chevronné Avatar de jacky01
    Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    537
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2007
    Messages : 537
    Par défaut
    j'avoue que je n'est pas tout a fait compris la solution de lutecefalco. (cela ne veux pas dire qu'elle n'est pas bonne évidemment )

    A ta place je me mettrais en débug et ferais le chemin à bas e de

    this.parent.findcontrol(..) etc...

    ainsi tu récupère grace aux espions le type de chaque parent et tu peu naviguer comme ca. En plus tu peu même tester tes cast au passage.

    Voilà celà n'engage que moi mais j'aurais procédé ainsi.

  7. #7
    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
    Dans MenuNav:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public ReadOnly property DivFondSignId as string
    get
    return divFondSign.ClientID
    end get
    end property
    Dans DetailGi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    private divFondSignId as string
    public property DivFondSignId as string
    get
    return divFondSign.ClientID
    end get
    set(byval value as string)
    divFondSign = value
    end property
    
    Protected Sub lbContact_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lbContact.Click
            If Profile.IsAnonymous Then
                Dim div As HtmlControls.HtmlControl = Page.FindControl(divFondSignId)
                div.Style("Display") = "Block"
            Else
                Response.Redirect("~/Navigation/Contact.aspx?id=" & IdGig)
            End If
        End Sub

    Dans le PageLoad de ta page:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DetailGig.DivFondSignId = MenuNav.DivFondSignId

  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
    Merci LuteceFalco, c'est vraiment cool.

    Alors pour la propriété ReadOnly, OK, j'ai compris et ça marche bien.
    Pour le Load de la page, j'ai compris aussi, maintenant c'est facile. Mais ça marche pas à cause de la suite.

    Pour le module DetailGig il me dis un truc que je crois comprendre mais pas sûr. Selon le code suivant, placé en haut du CodeBehind du Module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Private _divFondSignId As String
        Public Property DivFondSignId() As String
            Get
                Return DivFondSign.ClientId
            End Get
            Set(ByVal value As String)
                DivFondSign = value
            End Set
        End Property
    J'ai changé un petit détail :
    un _ sur le nom de la Private (VB pas de dif entre Majuscule et miniscule)
    Mais du coup je ne comprends pas à quoi elle sert.
    En plus de ça il me dis que DivFondSign n'est pas déclaré. Ce que je trouve normal puisque c'est l'ID du DIV dans l'autre module.

    Alors j'ai du mal à suivre ce qu'il faut que je mette là parce que je savais même pas qu'on pouvait charger des propriétés avec des éléments venant d'objet de la page ou du composant.

    Mais peut être que j'ai mal recopié un truc aussi.

  9. #9
    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
    C'est normal. Une propriété public sert en gros à définir ou récupérer une valeur privée que tu veux pas exposer

    Ton code devrait être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Private _divFondSignId As String
        Public Property DivFondSignId() As String
            Get
                Return _divFondSignId 
            End Get
            Set(ByVal value As String)
                _divFondSignId = value
            End Set
        End Property
    
    
    Protected Sub lbContact_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles lbContact.Click
            If Profile.IsAnonymous Then
                Dim div As HtmlControls.HtmlControl = Page.FindControl(_divFondSignId)
    )
                div.Style("Display") = "Block"
            Else
                Response.Redirect("~/Navigation/Contact.aspx?id=" & IdGig)
            End If
        End Sub

  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
    Ok, en réfléchissant et en manipulant le code, j'étais arrivé à la même chose, sauf pour l'appel de propriété lors de la création du DIV avec le DIM HTMLControls.

    ALors par contre, avec ou sans le _ ça marche pas, toujours le même message d'erreur.
    La référence d'objet n'est pas définie à une instance d'un objet.
    Sur la ligne de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    div.Style("Display") = "Block"
    Et la définition des propriétés dans la page, je l'ai mis dans le Load et dans le Init pour tester.

    Du coup, je vois pas pourquoi il arrive à créer l'objet et qu'il ne veux pas y accéder.


    @ Jacky01 : désole, j'avais pas vu ta réponse (seulement maintenant parce que scrollais) Ton idée est bonne et si la solution de LuteceFalco n'aboutit pas, je verrais à l'utiliser. Mais je trouve que celle de LuteceFalco est un poil plus sexy.

  11. #11
    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
    Surement parce qu'il faut pas utiliser ClientID mais un autre ID dont je n'ai plus le nom en tête

  12. #12
    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
    Essaye UniqueId pour voir

  13. #13
    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
    T'es trop fort !

    J'ai essayé avec UniqueID (vu la définition, je me suis que c'était bon) et bingo, ça marche.
    Pourtant, CLientID avait du bon, vu l'emploi de l'AJAX.

    Bref, merci beaucoup.

    Merci aussi à Jacky01, même si je n'ai pas retenu ton idée, ça fait plaisir de sentir des gens qui donnent un coup de main.

  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 ressort ce topic parce que j'ai un détail qui a changé dans ma gestion et je bloque.

    Le truc est simple : le composant n'est plus dans la page, mais dans la Master page.

    Donc il faut que je pointe dessus à partir de la page, mais dans la MasterPage et je trouve pas le truc.

    Donc en gros c'est ce bout de code là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DetailGig.DivFondSignId = MenuNav.DivFondSignId
    MenuNav est dans la MasterPage, pour faire simple.

    Donc je viens d'essayer pas mal de combinaison de Me et de Page, mais visiblement il doit me manquer un détail pour remonter dans la MasterPage. J'ai comme l'impression qu'elle est pas vraiment "au dessus".

    Une idée ?

  15. #15
    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

  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
    Merci pour ce tuto, c'est génial.
    Du ocup, j'ai déplacé tout mon cod edu composant vers la MasterPage, c'est plus direct.
    ça fait du volume à gérer, mais je crois que je gagne en performance.
    Vu que ma gestion de navigation et d'inscription ce fait dans ce composant et qu'il est directement placé dans la MasterPage, j'ai jugé plus intelligent de suppirmer l'étage Composant.

    Maintenant j'ai un autre souci : ça marche plus !!! Je sais pas ce que j'ai bougé, mais y a plus rien qui marche, même en remettant le composant.

    Donc là, on me dit : "Bon courage"...

    @+

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

Discussions similaires

  1. [XL-2007] Créer du code dans le classeur A à partir d'un autre classeur B
    Par geo909 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/05/2009, 17h36
  2. Réponses: 2
    Dernier message: 05/01/2009, 12h45
  3. Comment accèder aux composants graphique à partir d'un autre thread ?
    Par PerpetualSnow dans le forum Windows Forms
    Réponses: 6
    Dernier message: 07/03/2007, 11h11
  4. Réponses: 3
    Dernier message: 19/06/2006, 10h26
  5. Réponses: 2
    Dernier message: 25/03/2005, 09h23

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