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 :

Attaquer les méthodes d'un controle depuis une classe


Sujet :

ASP.NET

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 30
    Points : 18
    Points
    18
    Par défaut Attaquer les méthodes d'un controle depuis une classe
    Bonjour,
    Donc voila j'ai un fichier ascx sans code behind. En fait j'utilise ce controle utilisateur depuis une classe qui est dans AppCode (ceci me permet de vraiment différencier le code. Pour un formulaire par exemple, je garde le meme fichier ascx mais grace a l'héritage, mon formulaire est vraiment personnalisé en fonction si c'est ajout ou modif). J'accède aux champs de mon formulaires depuis ma classe via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Control controle = LoadControl("~/UC/formulaire_cs/toto.ascx");
    DropDownList _ddl_intitule = (DropDownList)controle.FindControl("ddl_intitule");
    Le problème est que j'aimerais ajouter un controle utilisateur dans mon fichier ascx... Jusque la pas de soucis mais comment puis-je accéder aux méthodes (créées dans le code behind) de mon controle utilisateur??
    Je n'arrive pas a créer dans ma classe mon controle sous la meme forme que la DDL de l'exemple ci dessus...

    Lorsque je fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Control test = (Control)controle.FindControl("uc_modif_criteres_dyn");
    ("uc_modif_criteres_dyn" est l'ID de mon controle utilisateur)
    il me dit que test est du type "ASP.uc_formulaire_criteres_modif_liste_dyn_ascx"

    Le problème est que je n'arrive pas a bien caster mon objet "test" afin de pouvoir accéder aux fonction que j'avais déclaré dans le code behind (par exemple pouvoir faire "test.ma_fonction()")...

    En fait ce que j'aimerais bien c'est pouvoir créer mon userControl de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MonControle userContr = (MonControle )controle.FindControl("ID_de_mon_controle");
    userContr.ma_fonction();
    ma_fonction étant une fonction créée dans le code behind de mon controle utilisateur.

    Quelqu'un sait-il si ceci est possible, ou une piste ou une alternative...
    Je ne sais pas si j'ai été assez clair mais la jsui vraiment bloqué.

    Sioouupplllééé......
    Merci bien en tout cas...

  2. #2
    Rédacteur

    Inscrit en
    Juin 2004
    Messages
    744
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juin 2004
    Messages : 744
    Points : 1 352
    Points
    1 352
    Par défaut
    Si je comprend bien tu aimerais avoir un fichier sources avec la la logique du déroulement des opérations et puis plusieurs users controls (un pour l'ajout et un pour la modification) c'est ça ?

    Je ne suis pas sur de bien comprendre. Peux tu me dire exactement comment tu veux travailler ? je n'ai pas bien saisi le but de l'opération.

    Merci,

    Ludovic,

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    en fait j'ai un formulaire qui peut etre utilisé soit en modification soit en insertion.
    Donc j'ai mon formulaire en ".ascx" sans code behind.
    Ensuite j'apelle ce formulaire via une classe qui est dans AppCode. par exemple
    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
     
        public abstract class toto : UserControl
        {
            Control controle = LoadControl("~/UC/formulaire_cs/mon_form.ascx");
            DropDownList _ddl = (DropDownList)controle.FindControl("ddl");
            ...
        }
     
        public class ajout : toto
        {
              ...
        }
     
        public class modif : toto
        {
              ...
        }
    Ces classes permettent de piloter mon .ascx...
    J'apelle directement soit ma classe modif soit ma classe ajout ce qui me permet d'avoir un code commun (dans toto) et des codes bien distinctes, ce qui est pratique pour l'enregistrement par exemple (dans ajout ou modif).

    J'éspère avoir été un peu plus clair si qqn a une idée pour la question un peu plus haut

    Merci

  4. #4
    Rédacteur

    Inscrit en
    Juin 2004
    Messages
    744
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juin 2004
    Messages : 744
    Points : 1 352
    Points
    1 352
    Par défaut
    A ta place je prendrais le problème dans l'autre sens.

    Dans ta Dll
    Une interface : IOperation avec un méthode enregistrer()
    Deux classes : OperationSave et OperationNew qui implementent IOperation

    OperationSave.enregistrer(){ UPDATE ....... }
    OperationNew.enregistrer() { CREATE ....... }

    Dans ton controle
    En cas d'ajout :
    IOperation op = new OperationNew();
    En cas de modif:
    IOperation op = new OperationSave();
    Puis dans tout les cas:
    op.enregister();

    Maintenant si tu veux que ta dll modifie tes controles suivant le code, a ta place j'ajouterais des Property public à ton user control et je les appelerais depuis la dll. Mais je ne pense pas que ça soit la manière la plus propre de travailler.

    Ludovic,

  5. #5
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    euh...oué...
    j'ai pas trop compris (je ne connais pas IOperation en meme temps lol).
    Mais tout ceci fonctionne mon seul problème est que je n'arrive pas a caster mon usercontrol depuis ma classe.

    En fait j'ai utilisé ce système car mes userControl sont parfaitement autonome. Par exemple pour un ajout, j'apelle ma classe en mode ajout et tout est géré tout seul via la classe (validation, exceptions, insertion en base).

  6. #6
    Rédacteur

    Inscrit en
    Juin 2004
    Messages
    744
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juin 2004
    Messages : 744
    Points : 1 352
    Points
    1 352
    Par défaut
    IOpération est une interface que je te proposais de créer

    En gros tu arrives à récupérer ton control depuis ta classe mais pas son contenu.

    A mon avis c'est parceque les controles de ton user control ne sont pas Public.

    Si par exemple tu veux modifier le contenu d'une textbox appelé Textbox1.
    Je te conseil de créer un proprieté dans ton user control :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public string ValueOfTextBox1
    {
       get
        {
           return textbox1.text;
        }
       set
       {
         textbox1.text = value;
       }
    }
    Ensuite dans ta classe si tu arrives a récupérer un objet du type de ton usercontrol il te suffit de faire : MonObject.ValueOfTextBox1 = "Ma nouvelle valeur"

    ça devrait fonctionner.

    Ludovic,

  7. #7
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    en fait je peux bien récupérer tous mes objets de la page aspx. je peux accéder a mes textbox (et tout le reste), je peux les modifier et tout et tout par cette méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TextBox _txt_ligne_1 = (TextBox)controle.FindControl("txt_ligne_1");
    Je peux accéder a mon UserControl aussi mais je n'arrive pas a le caster en fait. (le caster me permettrait d'accéder a ses fonctions créées dans le code-behind).

    C'est la mon problème...

    Merci bien pour ton aide au fait et bon ap' si tu va manger

  8. #8
    Membre éprouvé Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Points : 1 256
    Points
    1 256
    Par défaut
    Si je comrpends bien, tu met un ascx dans un autre ascx qui lui est dans ta page ?
    Par exemple l'ASCX de type UC1 contient l'ASCX de type UC2 avec comme ID idUC2 et UC1 est dans le page P1 avec comme ID idUC1

    Et ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UC1 monUC1 = (UC1)Page.FindControl("idUC1");
    UC2 monUC2 = (UC2)monUC1.FindControl("idUC2");
    ça ne fonctionne pas, c'est bien ça ?

  9. #9
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    Voui c'est ca.
    Le problème est que UC1 ne possède pas de code behind, je l'attaque par une classe qui est dans la AppCode (pour les raisons expliquées avant).

    Et je n'ai pas de type UC2... j'ai essayé avec le namespace mais je n'y arrive pas...

    Lorsque je fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Control UC2 = (Control)controle.FindControl("idUC2");
    je récupère bien l'objet mais je voudrais le caster pour pouvoir accéder aux méthodes crées dans le code-behind de UC2 de la facon suivant:

  10. #10
    Membre expert
    Avatar de FremyCompany
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    2 532
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 2 532
    Points : 3 239
    Points
    3 239
    Par défaut
    TonObjet.GetType().GetMethod("ma_fonction").DynamicCall si je me souviens bien

  11. #11
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    YOUHOU !!!!!!!!!!!!!!!!!!!!
    Merci bien FremyCompany!!
    C'était quasiment ca! Je te remercie trop de m'avoir mis sur le droit chemin! lol

    Pour info voila la syntaxe exacte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Control mon_controle = (Control)controle.FindControl("ID_controle");
    object[] liste_param = new object[0];
    METIER.mon_objet_retour objet_retour = (METIER.mon_objet_retour)test.GetType().GetMethod("ma_méthode").Invoke(objet_retour, liste_param);
    Merci beaucoup aux trois compères qui m'ont aidé sur ce problème

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

Discussions similaires

  1. [ZF 1.9] Récupérer les resources (déclarée dans Bootstrap) depuis une classe "hors" MVC
    Par cyrille37 dans le forum Autres composants
    Réponses: 2
    Dernier message: 05/09/2009, 14h28
  2. Consommer les méthodes d'un controle depuis une classe
    Par chti_vince dans le forum ASP.NET
    Réponses: 8
    Dernier message: 12/07/2007, 09h22
  3. [C#] Accéder à un control depuis une class
    Par choas dans le forum Windows Forms
    Réponses: 4
    Dernier message: 02/05/2006, 13h43
  4. [MFC]agir sur un control depuis une dll
    Par giova_fr dans le forum MFC
    Réponses: 3
    Dernier message: 01/02/2006, 23h23
  5. Acces a un control depuis une autre classe
    Par schnito dans le forum MFC
    Réponses: 5
    Dernier message: 25/01/2004, 22h14

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