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 :

Parser un controle à partir d'une classe externe


Sujet :

ASP.NET

  1. #1
    Membre extrêmement actif
    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 : 54
    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
    Points : 1 434
    Points
    1 434
    Par défaut Parser un controle à partir d'une classe externe
    Salut tout le monde.

    Là je m'attaque à un truc qui me parait super balaise.

    J'ai fabriqué un ASCX (un contrôle utilisateur) et je voudrais le mettre en oeuvre à partir d'une classe externe. Je pense qu'en mettant du code je vais être plus explicite.

    J'ai un ASCX (un autre puisque tout mon site repose sur l'utilisation des ASCX.) dans lequel je monte une grosse ASP:Table. Dans chaque cellule je charge des contrôles (TextBox, dropDownList, ...). ça fait un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    With cellChamp
                    .Controls.Add(FormulairX.AjouterChamp("EXEC dbo.SITE_DefinitionChampFormulaire " & champ("Id_ChampFormulaire")))
                    .ID = "cell" & champ("Nom_Champ")
                    .CssClass = "FORM_CelChamp"
    End With
    cellChamp étant une cellule de la Table (asp:TableCell) qui acceuille un contrôle donné.
    la Fonction AjouterChamp de ma classe FormulaireX prends une requête SQL comme paramettre car avec le résultat de cette requête elle va tout faire. En voici le code.
    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
     
    Public Shared Function AjouterChamp(ByVal rqDefinitionChamp As String) As Control
                Dim dtDefinitionChamp As DataTable = New DManager("DataDev").RetournerTable(rqDefinitionChamp)
     
                Select Case dtDefinitionChamp.Rows(0).Item("Type_Champ")
                    Case "txt"
                        Dim ChampText As New TextBox
                        With ChampText
                            .Text = dtDefinitionChamp.Rows(0).Item("Param_Text1")
                            .ID = dtDefinitionChamp.Rows(0).Item("Type_Champ") & dtDefinitionChamp.Rows(0).Item("Nom_Champ")
                            .Width = Unit.Pixel(dtDefinitionChamp.Rows(0).Item("Param_Num1"))
                        End With
                        Return ChampText
     
                    Case "dac"
                        Dim dac As New Control
                        dac.Controls.Add(New System.Web.UI.WebControls.par)
     
     
                    Case Else
                        Dim ChampText As New TextBox
                        ChampText.Text = "sais pas"
                        Return ChampText
                End Select
            End Function
    Je vous ai pas mis tous les Case, l'idée c'est de voir le plus simple avec une TextBox, amis j'ai d'autre case qui font des trucs pas possible, genre deux DropDownList pour faire une recherche entre deux bornes dans la base.

    Là où je cale c'est sur le Case "dac". J'ai laissé mon cod ene cours car je ne sais pas trop quoi mettre. L'idée c'est de dire que je vais chercher mon ASCX qui s'appelle "DropDownAutoComplete" avec une chaine du genre :
    <CompoSiteropDownAutoComplete ID="dac1" runat="server"/>
    J'arrive à faire ça lorsque je suis dans un ASCX côté CodeBehind parce que j'utilise la fonction ParseControl de System.Web.UI.TemplateControl. Mais là, dans ma classe externe, j'arrive pas à l'appeller.

    Je pense bien que c'est aprce que je maitrise encore mal le concept objet et que ça doit être tout couillon à faire, mais je sèche.

    Pouvez vous m'aider ?

  2. #2
    Membre extrêmement actif
    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 : 54
    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
    Points : 1 434
    Points
    1 434
    Par défaut
    J'ai avancé. Je sais pas si c'est prce que c'est Vendredi ou parce que le soleil veux pas se montrer aujourdh'ui, mais j'ai fini par trouve comment mettre le ParseControl. ça doit être une des combinaisons que j'avais pas essayé.

    Voici donc le code qui n'est pas rejeté apr VS 2008 (je dit ça, aprce que aprés j'ai un autre souci qui doit être lié.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                    Case "dac"
                        Dim dac As New Control
                        dac.TemplateControl.ParseControl("<CompoSite:DropDownAutoComplete ID='dac1' runat='server'/> ")
                        Return dac
    J'ai remis que le Case "dac", histoire de pas trop charger.

    Alors maintenant, sur la page il me dit un truc pas sympa :
    La référence d'objet n'est pas définie à une instance d'un objet.
    Mais j'ai fait un New pourtant. Je comprends pas où est il veut que j'aille chercher la référence cette fois.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    A priori c'est TemplateControl qui vaut Nothing

    Essaie plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                    Case "dac"
                        Dim dac As Control = Me.ParseControl("<CompoSite:DropDownAutoComplete ID='dac1' runat='server'/> ")
                        Return dac

  4. #4
    Membre extrêmement actif
    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 : 54
    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
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci Tomlev

    Je viens d'essayer ta propositoin et il me retourne ce message :
    'Me' est valide uniquement dans une méthode d'instance.
    Je pense que le fait d'être dans une classe externe modifie les accés par rapport au fait d'être directement dans un ASPX ou un ASCX.
    J'ai essayé de passer par le Context, qui m'a donné de bons résultat par le passé sur la récupération de l'URL(par exemple) Mais j'y arrive pas non plus.

    Une autre idée ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    remplace Me par une référence à la page (ou au usercontrol) dans laquelle tu veux créer le contrôle

  6. #6
    Membre extrêmement actif
    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 : 54
    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
    Points : 1 434
    Points
    1 434
    Par défaut
    Merci pour ton aide.

    L'ennui c'est que je ne vois pas comment je peux faire ça. Ma Fonction retourne justement un contrôle et elle est appelée de façon dynamique, donc si je rajoute une truc dedans, une référene ou un simple paramètre il faut que je fasse pour tous les contrôle que je retourne.

    Et même là, j'ai du mal à comprendre.

    Tu peux m'aiguiller un peu plus ?
    Veux tu que je poste plus de code que ce que j'ai déjà fait, histoire d'avoir un vision plus globale de la chose ?

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Ben là je sais pas exactement comment marche ta fonction, donc effectivemnt un bout de code pourrait aider.
    Mais a priori je dirais qu'il faut que la fonction prenne en paramètre la Page ou UserControl qui va contenir les contrôles créés

  8. #8
    Membre extrêmement actif
    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 : 54
    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
    Points : 1 434
    Points
    1 434
    Par défaut
    Au niveau bout de code j'ai bien relu et j'ai tout posté dans mon premier message. Ce qu'il manque c'est peut être un peu d'explication supplémentaire.

    Mon système fonctionne sur une seule page ASPX. Lorsque que la page est appelée je prends un parametre de la QueryString pour savoir qu'elle est précisément cette page. Avec cet identifdiant je plonge dans la BDD pour aller chercher la liste des modules à afficher. Chacun de ces modules est un ASCX.

    Dans chaque ACSX j'ai, soit des propriétés (elles aussi enregistrées dans la BDD) soit des paramètres en QueryString. Avec tout ça je fait ce que dois faire le module (gestion de menu, affichage de texte, de news, forum, ...). Dans le cas qui nous ocupe il s'agit d'un module qui affiche un formulaire (rempli ou pas avec des infos venant de la BDD). Chaque contrôle du formulaire dispose d'une définition stockée en BDD. Du coup je dynamise à fond la gestion des formulaires et je peux ajouter ou enlever des chamsp à volonté, tout en conservant la gestion du stockage des informations.

    Donc, si tu reprends le code de mon premier message, le premier bout de code correspond à l'établissement d'une cellule de Table pour mettre le champ de saisie (un contrôle tel que : TextBox, DropDonwList, ....). Cet ajout ce fait par la fonction AjouterChamp.

    Le deuxième bout de code est la Fonction elle même, dans son intégralité de fonctionnement. Je n'ai fait qu'enlever différent Case qui n'ont pas d'intérêt ici. La Fonction reçoit une chaine SQL pour savoir quel enregistrement de définition elle doit remonter.

    En fonction du "TypeChamp" elle sait quel Case elle doit prendre. Dans l'exemple que j'ai laissé tu peux voir comment j'ajoute un champ texte à partir d'une TextBox et comment je la défini. Le Case "dac" est pour ajouter mon nouveau contrôle ASCX.

    Vu que ce contrôle est une fabrication de ma part, j'arrive pas à lui faire la même chose qu'avec une TextBox, c'est à dire lui faire un New et le retourner. Ce qu'il faut garder à l'esprit c'est que la Fonction retourne (avec un vrai Return) un Object de Type Control. Mon ASCX dispose normalement de ce type (ou alors j'ai pas tout compris). Du coup je ne peux pas faire de référence à la cellule qui va l'acceuillir puisque de fonctionnement est inverse : la cellule appelle la fonction qui lui renvoi un Control et pas "je prends la cellule et je lui mets un Control dedans".

    Y vois tu plus clair avec ça ?

    Du coup, je me suis dis aussi que peut être je faisait mal mon contrôle et je devrais le fabriquer dans une autre classe externe lui aussi, de manière à pouvoir lui faire un New. Mais là, je sais pas faire. La dernière fois que j'ai essayé un truc pareil, j'ai ramé pendant trois jours pour finir par abandonner, faute de temps. Maintenant que je suis à mon compte et que le site sur lequel je travail est en ligne et peut fonctionner sans ça, je peux prendre le temps d'apprendre à faire ce truc, il me faut juste un petit coup de main de la part de quelqu'un de patient (heu oui, parce que parfois, je comprends pas vite....)

    Mais je reste ouvert à toute proposition. S'il faut changer le contrôle, pas de souci, faut juste me donner la structure de base du code.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Je ne suis pas sûr d'avoir compris la totalité du problème, mais pour moi il suffirait que la fonction AjouterChamp prenne en paramètre un TemplateControl (classe dont héritent Page et UserControl), de façon à pouvoir parser l'ASCX. A priori il n'y a même pas besoin que ce soit directement le contenant du contrôle que tu crées, passer une référence à la page devrait suffire.

  10. #10
    Membre extrêmement actif
    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 : 54
    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
    Points : 1 434
    Points
    1 434
    Par défaut
    Oui, je suis d'accord avec toi Tomlev, mais, comme j'ai dit un plus haut, ça va me faire modifier pas mal de code.

    La Fonction retourne un Control et pas "place une contrôle dans un autre". Parce que, pour les contrôle genre TExtBox, le paramettre va aps servir àgrnad chose, amis aprtout où j'appelle cette fonction je dois remettre la référence.

    Ou alors je fais une surcharge pour pas retaper plein de code. Sauf que la surcharge, ben j'ai pas tout compris.

    Du coup, je me trouve avec deux trucs à apprendre :
    - la surcharge
    - la création de contrôle par une classe externe et pas un ASCX

    Je vais refaire des essais au vu de ces nouvelles pistes.

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par zooffy Voir le message
    La Fonction retourne un Control et pas "place une contrôle dans un autre".
    Oui, j'ai bien compris ça
    Mais je ne dis pas que ta fonction doit placer le nouveau contrôle dans le contrôle passé en paramètre... C'est juste que tu as besoin de ce contrôle en paramètre pour pouvoir faire le ParseControl. Enfin, je crois...

    Sinon, vu que tu en as besoin que dans certains cas, tu peux peut-être accepter une valeur nulle (nothing), et juste lever une erreur si c'est nothing alors que tu en as besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Shared Function AjouterChamp(ByVal rqDefinitionChamp As String, Dim parent As TemplateControl) As Control
     
    ...
                    Case "dac"
                        If parent IsNot Nothing Then
                            Dim dac As Control =  parent.ParseControl("<CompoSite:DropDownAutoComplete ID='dac1' runat='server'/> ")
                            Return dac
                        Else
                            Throw New ArgumentNullException("parent", "Le paramètre parent doit être spécifié pour un UserControl")
                        EndIf
    ...
     
            End Function
    Et pour pas avoir à tout modifier tout ton code existant là ou ce n'est pas nécessaire, tu fais une surcharge comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Shared Function AjouterChamp(ByVal rqDefinitionChamp As String) As Control
        Return AjouterChamp(rqDefinitionChamp, Nothing)
    End Function

  12. #12
    Membre extrêmement actif
    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 : 54
    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
    Points : 1 434
    Points
    1 434
    Par défaut
    Ok, je vois mieux ce que tu veux dire.
    J'ai mofidier ta propositoin car j'ai rencontré divers soucis :
    - la référence, tel qu'est fait mon code, ne peut se faire que sur la cellule, donc pas compatible avec une TableCell
    - l'idée de référence est séduisante et, à mon avis, plus performante, du coup j'ai fait une référence sur la cellule pour y ajouter le contrôle dedans, partout
    - maintenant je n'arrive pas à faire le ParseControl sur le cellule, j'ai toujours cette histoire de référence à membre non partagé

    Voici le code actuel, aprés modification
    Page d'origine, côté CodeBehind :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    With cellChamp
                    FormulairX.AjouterChamp("EXEC dbo.SITE_DefinitionChampFormulaire " & champ("Id_ChampFormulaire"), cellChamp)
                    .ID = "cell" & champ("Nom_Champ")
                    .CssClass = "FORM_CelChamp"
                End With
    Et le code dans la classe externe qui fonctionne bien pour tous les autres contrôles :
    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
     
            Public Shared Sub AjouterChamp(ByVal rqDefinitionChamp As String, ByRef cel As TableCell)
                Dim dtDefinitionChamp As DataTable = New DManager("DataDev").RetournerTable(rqDefinitionChamp)
     
                Select Case dtDefinitionChamp.Rows(0).Item("Type_Champ")
                    Case "txt"
                        Dim ChampText As New TextBox
                        With ChampText
                            .Text = dtDefinitionChamp.Rows(0).Item("Param_Text1")
                            .ID = dtDefinitionChamp.Rows(0).Item("Type_Champ") & dtDefinitionChamp.Rows(0).Item("Nom_Champ")
                            .Width = Unit.Pixel(dtDefinitionChamp.Rows(0).Item("Param_Num1"))
                        End With
                        cel.Controls.Add(ChampText)
     
                    Case "dac"
                        cel.Controls.Add(TemplateControl.ParseControl("<CompoSite:DropDownAutoComplete ID='dac1' runat='server'/> "))
     
                End Select
            End Sub
    Donc maintenant faut juste que je fasse un ParseControle dans la cellule et tout marchera, même ce que je ferais plus tard.

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    - maintenant je n'arrive pas à faire le ParseControl sur le cellule, j'ai toujours cette histoire de référence à membre non partagé
    Parce que dans ton code tu n'appelles pas ParseControl sur la cellule, mais directement sur le type TemplateControl, comme si c'était une méthode statique (Shared), alors que c'est une méthode d'instance.
    Mais de toutes façons tu ne pourrais pas appeler ParseControl sur la cellule, parce que TableCell n'hérite pas de TemplateControl.
    Tu ne peux appeler ParseControl que sur un objet de type TemplateControl (ou un type hérité de TemplateControl). Et comme je l'ai dit dans un précédent post, tu n'as pas besoin que ce soit le contrôle qui contiendra ton usercontrol : tu peux très bien créer ton UserControl en appelant ParseControl sur la page, et l'ajouter ensuite à une TableCell

  14. #14
    Membre extrêmement actif
    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 : 54
    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
    Points : 1 434
    Points
    1 434
    Par défaut
    D'accord, je commence à comprendre.
    Donc j'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim dac As New System.Web.UI.Page
    cel.Controls.Add(dac.ParseControl("<CompoSite:DropDownAutoComplete ID='dac1' runat='server'/> "))
    Mais là il me dit :
    La valeur ne peut pas être null.
    Nom du paramètre : virtualPath
    Et je trouve pas ce paramètre dans la liste des propriétés de Page.
    Il doit me manquer quelque chose, mais je trouve pas quoi.

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Il ne faut pas créer une nouvelle page, il faut utiliser la page dans laquelle le contrôle va être placé. Et donc passer à ta fonction une référence à la page

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim dac As Control
    dac = laPage.ParseControl("<CompoSite:DropDownAutoComplete ID='dac1' runat='server'/> ")
    cel.Controls.Add(dac)

  16. #16
    Membre extrêmement actif
    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 : 54
    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
    Points : 1 434
    Points
    1 434
    Par défaut
    C'est cette référence à la page que je comprends pas.
    Comment je lui envoi. J'ai bien relu ton code plus haut, mais je capte pas ce que je dois faire, surtout maintenant que j'ai mis une référence à la cellule d'acceuil des contrôles.

    Parce que, du coup, c'est vachement mieux pour moi d'avoir cette référence à cette cellule. Je me suis également aperçu que j'avais pas tant de code que ça à modifier, pour une fois j'ai bien fait les choses : un appel et une fonction, basta.

    Et si je ramène ma Classe Externe dans mon ASCX, est ce que je ne gagne pas en maniabilité et en performance ?
    Parce que là, si j'ai tout dans l'ASCX, je pointe sur ce que je veux, non ?

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    En fait, je viens de réaliser qu'à partir de la cellule tu as accès à la page... via la propriété Page (à condition d'avoir déjà ajouté la cellule à la page bien sûr)

    Donc tu peux faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim dac As Control
    dac = cel.Page.ParseControl("<CompoSite:DropDownAutoComplete ID='dac1' runat='server'/> ")
    cel.Controls.Add(dac)

  18. #18
    Membre extrêmement actif
    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 : 54
    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
    Points : 1 434
    Points
    1 434
    Par défaut
    ça marche !

    J'ai du modifier l'orre de mes lignes de code dans l'ASCX, lorsque je fais les ajouts de cell dans les row et de row dans la table. En fait je le fait toujours à la fin des procédures par logique personnelle et surtout parce que je croyais qu'il fallait d'abords définir la cellule avant de la mettre dans une Row (et pareil pour la row dans la table). Mais ça marche bien.

    Bon, ben maintenant j'ai plus qu'à fignoler mon Contrôle pour récupérer les données, parce que là, c'est pas gagner. Dans le contrôle qui m'occupe actuellement j'utilise un AutoCompleteExtender et c'est pas simple de récupérer la donnée saisie et encore moins de l'injecter au départ.

    Mais sera l'objet d'un autre topic, je pense.

    Merci Tomlev.

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

Discussions similaires

  1. Accéder à un UIElement à partir d'une classe externe
    Par tom741 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 02/12/2009, 20h51
  2. SetText d'un JTextField à partir d'une classe externe
    Par Zak Blayde dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 15/11/2008, 21h12
  3. Probleme affichage Clip addchild à partir d'une classe externe
    Par Niokizou dans le forum ActionScript 3
    Réponses: 3
    Dernier message: 23/04/2008, 15h53
  4. Réponses: 12
    Dernier message: 03/11/2005, 18h45
  5. [EJB][JONAS] EJB utilisant une classe "externe"
    Par Gregory3000 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 13/12/2004, 19h57

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