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 :

Appeller une fonction de la page aspx depuis un control ascx


Sujet :

ASP.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 36
    Points : 13
    Points
    13
    Par défaut Appeller une fonction de la page aspx depuis un control ascx
    Bonjour a tous


    J'essaye de mettre en place un projet dans lequel j'ai une page "page1.aspx".
    Dans cette page j'insere une controle user "User1.ascx".

    Dans mon usercontrol j'ai une forte de sondage et je voudrais que quand l'utilisateur valide grâce au clic sur mon button1 appeller une fonction qui est contenu dans le code de ma page aspx

    Je sais pas si c'est bien clair

    Page aspx :


    Ma page User1.ascx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Button1_Click(sender, e) 
    {
           // Executer la fonction Mafonction() contenu dans la page page1.aspx
     
    }
    J'essayer plusieurs solution comme Server.transfert... mais rien ne correspond

    Merci a tous pour votre aide

  2. #2
    Membre habitué Avatar de Zeckard
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 108
    Points : 183
    Points
    183
    Par défaut
    Dans mon usercontrol j'ai une forte de sondage et je voudrais que quand l'utilisateur valide grâce au clic sur mon button1 appeller une fonction qui est contenu dans le code de ma page aspx
    Une forte de sondage ?

    Pourquoi ne mets tu pas directement ta fonction dans ton User control ? Comme ça, tu gères tout sur ton composant et tu n'as plus qu'à le poser sur ta page1.aspx.
    Où si tu veux vraiment faire remonter ton événement sur ta page, utilise un délégué.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Button1_Click(sender, e) 
    {
           this.mafonction();
    }

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 36
    Points : 13
    Points
    13
    Par défaut
    Bonjour

    et merci pour votre réponse


    Oups oui plutot une sorte de sondage ^^

    J'ai bien pensé a mettre ma fonction directement dans mon ascx mais comme ma fonction est censer aussi agir sur un table de ma page aspx et si je la met dans mon ascx je sais pas comment lui dire qu'elle soit agir sur les "element de la boite a outils" qui sont sur ma page aspx

    Quand au délégué je ne connais pas du tout, je vais orienté mes recherches dans ce sens.

    En tous cas je vous remercie.

  4. #4
    Membre habitué Avatar de Zeckard
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 108
    Points : 183
    Points
    183
    Par défaut
    Ici, chapitre IV, tu trouveras ce qu'il te faut sur les délégués.

    Tu agis comment sur "ta boîte à outil" de ta page actuellement ? JavaScript ? Côté serveur ?

    Car même sur ton User Control, tu as accès à l'élément "Page" et où tu peux récupérer ton tableau si tu lui as donné un ID.
    Suffit ensuite de le caster pour faire à peu près ce que tu veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                Object MonTableau = Page.FindControl("IDdemontableau");
                (MonTableau as Table).BorderColor = Color.AliceBlue;
    Là c'est un exemple où je change la couleur de bordure mais ça peut être n'importe quoi d'autres.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 36
    Points : 13
    Points
    13
    Par défaut
    Merci pour tes informations, grâce à tes lien et message j'apprend pas mal de chose et tant mieux parce que l'asp.net pour moi c'est vraiment nouveau

    Pour l'instant j'utilise pas de javascript mais en effet sa va peut etre la solution que je devrais tester

    j'ai testé ta méthode en l'adaptant a mes element biensur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Object MonTableau = Page.FindControl("IDdemontableau");
                (MonTableau as Table).BorderColor = Color.AliceBlue;
    et j'obtien l'erreur suivant
    Erreur d'exécution Microsoft JScript: Sys.WebForms.PageRequestManagerServerErrorException: La référence d'objet n'est pas définie à une instance d'un objet.

  6. #6
    Membre habitué Avatar de Zeckard
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 108
    Points : 183
    Points
    183
    Par défaut
    Ça veut dire que le Page.FindControl n'a pas trouvé l'ID du control que tu as spécifié et il te retourne donc null.

    Mets toi en debug et regarde ce que vaut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Page.FindControl("IDdemontableau");
    S'il est null, c'est qu'il y a un ID que tu n'as pas spécifié.

  7. #7
    Expert éminent
    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
    Points : 9 512
    Points
    9 512
    Par défaut
    Salut,

    Par principe, un objet ne voit que les méthodes/propriétés publiques d'un autre objet.

    Tu ne devrais pas demander à une classe d'aller chercher un autre objet ne faisant pas partie de son périmètre de responsabilités.

    A ce titre, l'usage de la méthode FindControl est à mon sens une mauvaise habitude. C'est pratique c'est certain mais un peu trop facile.

    Dans ton cas tu créés une dépendance très forte entre ton contrôle et ta page. A tel point d'ailleurs que tu ne pourras plus intégrer ce contrôle dans une page qui ne dispose pas de la fonction en question.

    Ma logique est la suivante:
    1. L'internaute clic sur le bouton de ton contrôle;
    2. Le contrôle déclenche un évènement;
    3. La page capture cet évènement (parce qu'elle s'y est abonnée);
    4. La page appelle la fonction que tu souhaites.
    Cela est bien résumé dans ce tutoriel: http://lutecefalco.developpez.com/tu...e-asp-net/#LII. Lis le bien, c'est un fondement.

    A+

  8. #8
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 36
    Points : 13
    Points
    13
    Par défaut
    Bonsoir

    Tous d'abord excuser moi pour mon absence mais j'avais une petite semaine de vacance et Merci a tous pour vos réponse.

    Zeckard, j'ai suivi tes conseil et la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Page.FindControl("IDdemontableau");
    Me retourne bien une valeur null pourtant j'ai bien verifier que l'id soit renseigné et c'est bien le cas, je ne comprend donc pas pourquoi la valeur est toujours null.

    Immobilis Merci pour ton lien, je regarde cela de suite.

  9. #9
    Expert éminent
    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
    Points : 9 512
    Points
    9 512
    Par défaut
    Citation Envoyé par Alegreg Voir le message
    la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Page.FindControl("IDdemontableau");
    Me retourne bien une valeur null
    C'est normal, la fonction FindControl n'est pas récursive et se limite aux objets dans sa liste de contrôles. Si le tableau est encapsulé dans un contrôle utilisateur, la méthode FindControl ne le trouvera pas.

    Si tu y tiens, tu trouveras des implémentations de FindControl récursifs.

    A+

  10. #10
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Bonjour,
    pourquoi ne pas utiliser une interface dans ce cas là, après tu auras juste à vérifier que ta page implémente cette interface, si c'est le cas tu pourras appeler la fonction que tu as défini au niveau de ton interface:

    Exemple:
    Mon interface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public interface IColor
    {
        void ChangerCouleur(Color couleur);
    }
    Ma Page aspx.cs:
    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
     
    using System;
    using System.Drawing;
     
    public partial class _Default : System.Web.UI.Page, IColor
    {
        protected void Page_Load(object sender, EventArgs e)
        {
     
        }
     
        #region IColor Membres
     
        public void ChangerCouleur(System.Drawing.Color couleur)
        {
            this.Page.Form.Style.Add("background-color", couleur.Name);
        }
     
        #endregion
        protected void Button1_Click(object sender, EventArgs e)
        {
            ChangerCouleur(Color.Blue);
        }
    }
    Ma page aspx:
    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
     
    <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
     
    <%@ Register src="WebUserControl.ascx" tagname="WebUserControl" tagprefix="uc1" %>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
        </div>
        <p>
            &nbsp;</p>
        <p>
            <uc1:WebUserControl ID="WebUserControl1" runat="server" />
        </p>
        </form>
    </body>
    </html>
    mon control.ascx.cs:
    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
     
    using System;
    using System.Drawing;
     
    public partial class WebUserControl : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
     
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            IColor maPage = this.Page as IColor;
            if (maPage != null)
            {
                // si ma page implémente l'interface Icolor alors mapage ne sera pas null
                maPage.ChangerCouleur(Color.Green);
            }
        }
    }
    mon control.ascx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>
    <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
    On voit bien que quand on appuie sur le bouton contenu dans la page le fond devient bleu et quand on appuie sur le bouton contenu dans le controle le fond devient vert

  11. #11
    Expert éminent
    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
    Points : 9 512
    Points
    9 512
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    Bonjour,
    pourquoi ne pas utiliser une interface dans ce cas là, après tu auras juste à vérifier que ta page implémente cette interface
    C'est une solution mais pour plein de raisons en fait:
    1. Parce que cette fonction n'est pas dans son périmètre de responsabilité;
    2. Parce que ce n'est pas au contrôle de faire cette vérification. Imagine que tu veuilles piloter une dizaine de fonctions détenues par d'autres objets;
    3. Parce que un objet ne devrait agir que sur les objets qu'il créé;
    4. Parce que tu ne permets pas au contrôle détenant cette fonction d'implémenter différemment la demande;
    5. Parce que tu contrains un objet à implémenter une interface alors que ce n'est pas nécessaire;
    6. Parce que tu introduis une condition dans ton code et que par là même tu augmentes son instabilité en ajoutant un chemin de décision (complexité cyclomatique).

    Voir ceci: http://fr.wikipedia.org/wiki/Loi_de_D%C3%A9m%C3%A9ter

    A+

  12. #12
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    oui tu as raison et c'est beaucoup plus simple que de mettre en place une interface

  13. #13
    Expert éminent
    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
    Points : 9 512
    Points
    9 512
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    oui tu as raison et c'est beaucoup plus simple que de mettre en place une interface
    Pas vraiment. Mettre une interface est très rapide, mais l'utilisation que tu proposes est, à mon avis, contraire à certains concepts de la POO.

    A+

  14. #14
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 1
    Points : 1
    Points
    1
    Par défaut probleme de l'utilisation des procedures stockées dans asp.net
    Svvvvvp j'ai un probleme dans mon code en asp.net concernant une page stock.aspx quand je fas appel a une procedure stockée par exemple dans stock.aspx.cs dans la classe load page ,il ne reconnait pasle datatable ni command ... j sais pas s'il faut ajouter un using mais ajouter tt ms en vain svvvp aider moi c pr ce mardi

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Points : 1 077
    Points
    1 077
    Par défaut
    L'utilisation d'une interface me parait evident. Je ne vois ce qu'il y a de contraire en POO???
    Pour ta procédure stockée : quel est l'erreur excatement ?

  16. #16
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    Citation Envoyé par Dokho1000 Voir le message
    L'utilisation d'une interface me parait evident. Je ne vois ce qu'il y a de contraire en POO???
    Loi de Déméter

    (d'ailleurs, je ne savais pas que ça avait un nom ça !)

    Mais après, le tuto mis en lien explique plutôt bien le problème lié à cet appel d'une méthode aspx de la part de l'ascx (je résume ^^).

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Points : 1 077
    Points
    1 077
    Par défaut
    Citation Envoyé par casiii Voir le message
    Loi de Déméter

    (d'ailleurs, je ne savais pas que ça avait un nom ça !)

    Mais après, le tuto mis en lien explique plutôt bien le problème lié à cet appel d'une méthode aspx de la part de l'ascx (je résume ^^).
    Aucun rapport entre une règle de conception et la POO. Je suis d'accord qu'idéalement ce serait mieux de la suivre mais ce n'est pas contraire a la POO.
    Tu proposes quoi ? D'utiliser la réflexion pour lancer sa méthode ? Je pense que c'est bien pire qu'utiliser une interface...

  18. #18
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Citation Envoyé par Dokho1000 Voir le message
    Aucun rapport entre une règle de conception et la POO. Je suis d'accord qu'idéalement ce serait mieux de la suivre mais ce n'est pas contraire a la POO.
    Tu proposes quoi ? D'utiliser la réflexion pour lancer sa méthode ? Je pense que c'est bien pire qu'utiliser une interface...
    Passer par un événement, quand le parent appelle l'enfant il peut passer par une méthode publique, par contre quand l'enfant veut appeler le parent il doit passer par un événement sur lequel est abonné le parent, et c'est le parent qui décide quoi faire quand cet événement est levé.

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    777
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 777
    Points : 1 077
    Points
    1 077
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    Passer par un événement, quand le parent appelle l'enfant il peut passer par une méthode publique, par contre quand l'enfant veut appeler le parent il doit passer par un événement sur lequel est abonné le parent, et c'est le parent qui décide quoi faire quand cet événement est levé.
    C'est une solution aussi effectivement...mais pour un débutant p-e un peu compliqué...(il faut connaitre la notion de delegate et d'event, passer les arguments, ...) l'interface à l'avantage d'être simple a comprendre...

  20. #20
    Expert confirmé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 066
    Points : 4 233
    Points
    4 233
    Par défaut
    Citation Envoyé par Dokho1000 Voir le message
    C'est une solution aussi effectivement...mais pour un débutant p-e un peu compliqué...(il faut connaitre la notion de delegate et d'event, passer les arguments, ...) l'interface à l'avantage d'être simple a comprendre...
    Moi aussi j'y comprenais rien et je les utilisais sans même connaitre leur fonctionnement, j'ai lu quelque tuto et j'ai commencé à comprendre leur fonctionnement, c'est comme les interfaces une fois sortie de la formation je ne savais pas ce que c'était exactement, à quoi elle servait.

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/09/2010, 16h57
  2. [SQL-Server] Comment appeller une fonction stockée en MS SQLServer depuis PHP ?
    Par momoG dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/12/2008, 16h11
  3. Réponses: 1
    Dernier message: 08/10/2008, 11h19
  4. Appeler une fonction d'un fichier SWF depuis un Form VB6
    Par Silk_do_Nadear dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 03/04/2007, 07h25
  5. Appeler une fonction d'un script PHP depuis HTML
    Par barthelv dans le forum Langage
    Réponses: 31
    Dernier message: 27/12/2005, 11h25

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