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 :

Modifier un label a partir d'une class


Sujet :

ASP.NET

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 57
    Points : 28
    Points
    28
    Par défaut Modifier un label a partir d'une class
    Bonjour,

    Tout est dans le titre, je vous explique plus en détail:
    Dans ma page aspx, je dispose de control par exemple:

    "test.aspx"
    <asp:Label ID="lblCreer" runat="server" Text=""></asp:Label>

    depuis "test.vb" dans le page_load
    modif_controls("test.aspx")


    Puis dans un fichier vb global, 'modif_controls.vb' je voudrais affecter une valeur au label via la fonction modif_controls():

    Faire la meme chose que si je fesait:
    lblCreer.Text = "toto" dans test.vb

    Sachant que je récupere Id et Text de mon label via une requete spécifique suivant le nom de la page. Mais cette partie la est ok

    J'ajoute que je ne veut pas avoir à passer la valeur de mon label en paramètres vu que cette fonction traite un nombre variable d'élément.

    Voila merci, j'espère avoir été asser clair sinon hésiter pas.
    Merci, Sam/

  2. #2
    Membre régulier Avatar de loulouklm
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 105
    Points
    105
    Par défaut
    Tu ne peux pas atteindre un contrôle inconnu par ta classe. Comment veux-tu que la relation se fasse ?
    Il faudrait instancié la page dans ta classe. Mais je ne pense pas que ce soit ton but... Tu veux probablement modifier ton contrôle dans cette classe que tu appellerais via la page test.aspx.vb ?

    Donne nous ton problème dans la globalité, je pense que tu n'as pas la bonne démarche.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    Default.aspx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <asp:Label runat="server" ID="lbl" Text=""></asp:Label>
    Default.aspx.vb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            load_forms("Default.aspx")
    End Sub
    Web_extractor.vb
    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
    21
    22
    23
    24
    25
     
    Shared Function load_forms(Byval page As String) As Boolean
            Dim controls_line As String = extract_data(page)
            Dim control() As String = Split(controls_line, ",")
                Select Case control(1)
                    Case "Label"
                        fill_label(control)
                    Case "ListBox"
                        fill_listbox(control)
                    Case "ComboBox"
                        fill_combobox(control)
                    Case "GridView"
                        fill_gridview(control)
                End Select
                i += 1
            End While
     End Function
     
    Shared Function fill_label(ByVal controls() As String) As Boolean
    /* Assignation des valeurs dans le label de default.aspx */
    /* controls(0) ---> ID  (Dans l'exemple 'lbl')                 */
    /* controls(1) ---> Type (Dans l'exemple 'Label')          */
    /* controls(2) ---> Text ( "test label value" par exemple */
     
    End Function
    Tout fonctionne parfaitement jusqu'a la fonction fill_label ou je ne sait pas comment faire pour faire référence au attribut de default.aspx

    y aurait'il un paramètre a passer de default.aspx.vb à Web_extractor.vb pour faire cela ?

    J'ai essayer des htmlcurrentcontext et plein d'objet bizarre mais sans succès.

    Voila, j'espere que c'est plus clair. merci

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Points : 1 561
    Points
    1 561
    Par défaut
    effectivement, il veut tendre vers ce qu'on souhaite tous, réduire le couplage entre une page et le code logique.
    malheureusement il a une démarche, qui va à l'inverse d'une démarche habituelle dans ce genre de cas.

    Globalement tu ne te pose pas les bonnes questions.

    Microsoft lorsqu'ils ont conçut Dotnet, ont intégré, dans les technologies Winforms, ASP.NET et WPF, une notion de "DATA-BINDING".

    C'est cette notion de "liaison aux données" qui va s'occuper de réduire le couplage entre ton UI et ton code logique...
    En fait le but de cette technique, est d'indiquer à ASP.NET que je vais asservir un label à une donnée particulière quelconque, de ton domaine de données.
    A chaque changement d'état de la page, si cette donnée a changé d'état, alors grâce à la liaison de données précédemment définie, le label reflètera ce nouvel état et non plus l'ancien.

    Ensuite tu essaie de découpler ton programme en utilisant une classe boite ou outils, qui va devenir vite ingérable et ce que tu essaie de faire, c'est aussi, faire un découpage comme on le ferais avec ASP.NET MVC...
    aussi je te conseillerai de t'orienter dans cette voie.

    ASP.NET MVC couplé au databinding te permettraient, je pense, de résoudre ta problématique avec un minimum de code.

    en plus ton problème vient du fait qu'une page est instanciée indépendamment de tes classes.
    Tu essaie de définir les valeur d'objets dont tu ne connais pas les références, car tu ne connais pas dans tes classes, la référence de la page conteneur.
    En plus ton modèle est un "module" ou classe statique, typiquement un manager, qui n'a donc pas d'instance, il faudrait demander à la page de lui transmettre sa référence, mais je te déconseilles de faire de la sorte, car là, il ne te reste, au vue de ton code que l'option de la Reflexion, qui est à utiliser avec une extrême précaution et parcimonie, surtout dans un projet ASP.NET.

    j'ai envie de dire que là... tu va très vite te retrouver le nez dans le mur, et ton projet va très vite devenir totalement impossible à maintenir, si tu persiste dans cette voie.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    Pourtant dans le projet nous avons déja une classe qui en recevant un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ByVal contenu As HtmlGenericControl
    Modifie le contenu des Labels et cela est visible au niveaux de la page aspx avec des choses comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim lbl As New Label
    lbl.Text = le_resultat
    lbl.ID = identifiant
    contenu.Controls.Add(lbl)
    Qu'est se que vous en dite ?

    Enfin merci quand même mais incluant mon code dans un projet beaucoup plus gros et étant plusieurs dévellopeur sur le coup je peut pas tout refaire en architecture MVC malheureusement.

  6. #6
    Membre régulier Avatar de loulouklm
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 105
    Points
    105
    Par défaut
    Le code ci-dessus manipule des contrôles. Toi tu manipules des "string"... Peut-être une piste.

    Que fait la fonction extract_data ?

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    Elle récupère dans une bdd les valeurs à affecter a une page:
    par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extract_data("default.aspx")
    Accède a une base de donnée ou il ya:
    [page][data]
    [default.aspx][lbl,Label,'test']
    [tata.aspx][cb,ComboBox,1475]

    La fonction extract_data me renvoit une string ---> lb,Label,'test'

    Bon c'est une version simplifier que je vous présente la. mais l'idée est la.

    j'ai essayer des truk comme cela mais sans succès:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function fill_label(Byval control as string)
       Dim ret_label as Label
       ret_label.ID = control(0)
       ret_label.Text = control(2)
    /* ??? */
    end function
    A partir des ??? ca bloque, comment affecter ce label a ma page default.aspx ^^;

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    Et sinon si je décide de passer ma 'page' en argument à ma fonction comment je pourrait procéder ?

  9. #9
    Membre régulier Avatar de loulouklm
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 105
    Points
    105
    Par défaut
    Voici le principe pour ajouter un contrôle (Label) à un autre (Page)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Label lbl = new Label();
     
    lbl.Text = "test";
     
    Page.Controls.Add(lbl);
    Bien entendu, tu peux remplacer les contrôles (Label et Page) par d'autres.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    Okey, j'avais essayer mais quel argument j'envoie a ma fonction pour avoir accès a 'page.controls.' ?

    (j'ai essayer d'envoyer directement page mais impossible de l'autre coté de recevoir un objet de type system.ui.web...)

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    Okay je viens de reussir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /* Envoit */
    function("default.aspx",Page)
    /* Reception */
    function(Byref page_name as string, ByRef Page As Web.UI.Page)

  12. #12
    Membre régulier Avatar de loulouklm
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 105
    Points
    105
    Par défaut
    Il faut que tu lui envoie ta page

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            protected void MyFunction(ref System.Web.UI.Page MyPage)
            { 
                Label lbl = new Label();
     
                lbl.Text = "test";
     
                MyPage.Controls.Add(lbl);
            }

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    Dernière petite question et je pense que mon problème sera résolu, y at'il un moyen d'éditer les controls déja présent sur la page plutôt que d'en ajouter de nouveau ?

    (Parce qu'avec cette méthode je suis obliger de supprimer les label de ma page aspx et de définir dans ma base en plus la position des labels, se qui me parait un peu lourd ^^)

  14. #14
    Membre régulier Avatar de loulouklm
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 105
    Points
    105
    Par défaut
    Oui, soit (à vérifier) tu peux y accéder directement MyPage.IdDeMonControle

    Soit tu peux créer des fonctions Public dans la classe MyPage pour faire le boulot :

    Voici l'algo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function RemplaceControle(Control ControleToAdd, String ControleStringToReplace)
    {
         control c = this.FindControl(ControleStringToReplace) ;
     
         if (c != null) c = ControlToAdd ;
    //Si ca marche pas, remplace les propriétés
    c.Text = ControlToAdd.Text;
     
    // etc...
     
    }
    Ou encore plus simple tu fais un accesseur
    public Label MyLabel()
    {
    set {...}
    get {...}
    }

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    Yes ! Niquel ca fonctionne du feu de dieux merci à toi ! Bon ben maintenant j'espère que tout va rouler pour ma version 100% paramétrable

    (Et merci pour l'indulgence cuis qu'un simple stagiaire )

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    Hum, j'ai l'impression qu'il ne trouve pas mon label et n'arrive donc pas à l'éditer, je me suis fait une fausse joie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (c != null) c = ControlToAdd ;
    c est toujours null alors que mon control existe. Le findcontrols n'a pas l'air de fonctionner.

    La référence d'objet n'est pas définie à une instance d'un objet.

  17. #17
    Membre régulier Avatar de loulouklm
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 105
    Points
    105
    Par défaut
    Ca dépend d'où tu déclenches la fonction.

    Si c'est du Page_Load de ta page mère ça devrait être bon.

    Si tu charges en allant chercher la page par son path, il faut que les contrôles soient instanciés.

    Essaie de voir de ce coté, les fonctions init & Co.

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    j'ai essayer avec 'init', 'load' 'preload' et toute les autres, rien n'y fait.
    j'ai remarquer dans la source que la span générer avait un id qui commencait par 'ctl00_Main_' j'ai essayer avec, et ca marche toujours pas.

    Mon label est introuvable, je me suis peut être trompé dans 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
    12
    13
     
    Shared Function fill_label(ByVal controls() As String, ByRef Page As Web.UI.Page) As Boolean
            Dim lbl_sent As New Label
     
            lbl_sent = Page.FindControl("ctl00_Main_" & controls(0))
            If lbl_sent Is Nothing Then
                lbl_sent = Page.FindControl(controls(0))
                If lbl_sent Is Nothing Then
                    Return False <--- Sort toujours ici 
                End If
            End If
            lbl_sent.Text = controls(2)
        End Function
    Au niveau de controls(0) j'ai bien 'LbComp' et au niveaux de controls(2) le texte que je veut ajouter.
    Elle retourne false tout le temp alors que dans ma page j'ai bien:

    Avant génération:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <asp:Label ID="LbComp" runat="server" Text="">
    Après génération:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <span id="ctl00_Main_LbComp"></span>

  19. #19
    Membre régulier Avatar de loulouklm
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 105
    Points
    105
    Par défaut
    Il ne faut pas confondre le ClientID et l'ID du contrôle coté serveur.

    Le "ctl00_Main_..." est l'id du contrôle coté client. Tu ne peux pas l'utiliser coté serveur.
    Coté serveur, ton ID est LbComp. C'est le seul ID à utiliser coté serveur

    Si ton control(x) renvoi ton label, tu dois pouvoir faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    lbl_sent = Page.FindControl("LbComp")
     
    lbl_sent.Text = "Mon Texte" ;

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 57
    Points : 28
    Points
    28
    Par défaut
    J'ai essayer en mettant en dur, ca marche toujours pas .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Shared Function fill_label(ByVal controls() As String, ByRef Page As Web.UI.Page) As Boolean
            Dim lbl_sent As New Label
            lbl_sent = Page.FindControl("LbComp")
                If lbl_sent Is Nothing Then
                    Return False
                End If
            lbl_sent.Text = "test"
    End Function
    Je pense que mon ' ByRef Page As Web.UI.Page' est bon puisque quand je fait un controls.add cela fonctionne parfaitement.



    Est se qu'il y a une procédure particulière à ajouter si j'ai ma balise label comprise dans une balise content ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <asp:Content ID="Content1" ContentPlaceHolderID="Main" runat="Server">
    <asp:Label ID="LbComp" runat="server" Text=""></asp:Label></div>
    </asp:Content>

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/05/2007, 15h51
  2. Réponses: 1
    Dernier message: 22/06/2006, 09h17
  3. Réponses: 6
    Dernier message: 21/05/2006, 20h37
  4. Réponses: 12
    Dernier message: 03/11/2005, 18h45

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