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

C# Discussion :

Est il possible de lier une action à un bouton crée dynamiquement?


Sujet :

C#

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Est il possible de lier une action à un bouton crée dynamiquement?
    Bonjour,

    Je suis débutant en C# et je rencontre un petit problème dans le développement d'une console d'administration permettant de déconnecter des users d'une application.

    J'affiche un tableau des utilisateurs connectés et je souhaiterai pouvoir en fin de ligne ajouter un bouton qui déconnecte l'utilisateur en question.


    Je n'arrive pas à lier une action àl'évènement click sur mes boutons crées dynamiquement.

    La solution que j'utilise pour l'instant est d'afficher au dessus de mon tableau une dropdownlist contenant les users connectés et un bouton associé à cette liste qui déconnecte l'utilisateur sélectionné. Cela marche car le bouton en question est déclaré dans ma page .aspx "en dur" et je peux donc lui associer une action à l'évènement _Click dans le InitializeComponent () de ma page aspx.as.

    Je n'arrive parcontre pas à le faire avec un bouton crée dynamiquement.

    Je cherche une solution me permettant d'associer à l'évènement _Click de chacun des boutons crés dynamiquement une fonction prenant l'ID du bouton en paramètre. Afin ensuite d'exécuter ma fonction de déconnexion (qui prend en paramètre l'id du user qui sera celui du bouton) au sein de cette fonction.

    Du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //dans InitializeComponent
    this.lesboutons.Click +=new System.EventHandler(this.lesboutons_Click(string id));
     
    //détail de la fonction associée à l'évènement Click d'un des boutons
    fonction lesboutons_Click (object sender, System.EventArgs e, string id)
    {
    deconnect(id)//il s'agit d'un appel de service web
    }
    Est ce possible, si oui comment fait on si non y a t'il une solution de contournement???

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Tu peux utiliser la propriété Tag de ton bouton.
    Quand tu crées un bouton, tu mets dans Tag l'id que tu veux, et dans la callback de click tu récupères l'id en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string id = (sender as Button).Tag.ToString();

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 153
    Points : 12 264
    Points
    12 264
    Par défaut
    J'affiche un tableau des utilisateurs connectés
    Avec un Repeater, une dataGrid, autre ?

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    J'utilise un tableau <asp:Table>.

    Skyounette quand j'utilise la complétion (dans microsoft visual sudio 2003) je ne trouve pas la propriété Tag pour mes boutons...

    D'autre part mon principal problème pour l'instant n'est pas tant la récupération de l'ID dans mon callback de Click mais bien comment associer un callback de click a un bouton créer dynamiquement.

    Voici le résumé de mon code :

    --> 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <%@ Page language="c#" Codebehind="WebMainForm.aspx.cs" AutoEventWireup="true" Inherits="CallBrokerServices.WebMainForm" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
    	
    <HEAD>
    <title>CONSOLE ADMINISTRATION MATISSE</title>
    <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
    <meta name="CODE_LANGUAGE" Content="C#">
    <meta name="vs_defaultClientScript" content="JavaScript">
    <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    <link rel="stylesheet" href="menu_style.css" type="text/css" media="print, projection, screen, tv">
    </HEAD>
    
    <body MS_POSITIONING="GridLayout">
    
    //formulaire
    <form id="Form1" method="post" runat="server">
    
    //le tableau en question
    <asp:Table id="header" GridLines="Both" runat="server" Width="98%">
       <asp:TableRow>
          <asp:TableCell>
                LoginName
          </asp:TableCell>
          <asp:TableCell>
                ServerComputerName
          </asp:TableCell>
          <asp:TableCell>
                ServerPID
          </asp:TableCell>
          <asp:TableCell>
                Colonne avec les boutons de déconnexion
          </asp:TableCell>		
       </asp:TableRow>
    </asp:Table>
    
    //bouton permettant d'afficher la liste des utilisateurs connectés 
    <asp:LinkButton id="matcollect" runat="server">affiche tableau</asp:LinkButton>
    
    //bouton de déconnexion lié à à la dropdownlist
    <asp:Button id="deco" runat="server" Text="DECONNECTER"></asp:Button>
    
    //Drop dow list affichant la liste des ID des users connectés
    <asp:listBox id="DDL1" runat="server" AutoPostBack="false"></asp:listBox>
    
    </form>
    </body>
    </HTML>

    Et voici le code de ma page aspx.cs (en gras l'endroit où je crée mes boutons):


    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    using System;
    using System.Globalization;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Web.Security;
    
    namespace CallBrokerServices
    {
       public class WebMainForm : System.Web.UI.Page
       {
          //declaration des webcontrols de la page .aspx
          protected System.Web.UI.WebControls.Table header;
          protected System.Web.UI.WebControls.Button deco;
          protected System.Web.UI.WebControls.LinkButton matcollect;
          protected System.Web.UI.WebControls.ListBox DDL1;
          
    
          #region Web Form Designer generated code
          override protected void OnInit(EventArgs e)
          {
                InitializeComponent();
                base.OnInit(e);
          }
    
          private void InitializeComponent()
          {   
                this.matcollect.Click +=new System.EventHandler(this.matcollect_Click);
                this.deco.Click +=new System.EventHandler(this.deco_Click);
          }
    
          private void deco_Click(object sender, System.EventArgs e)
          {
             //deconnecte le user selectionner dans la dropDownList via l'appel d'un service web
          }
    
          private void matcollect_Click (object sender, System.EventArgs e)
          {
                //recupère la liste des users connectés dans un tableau d'objets via un appel de service web
                object[] listeUsers = réponse service web...
                //nombre de cellules par utilisateur moins la derrière colonne
                int numcells = 3;
                //Header du tableau des utilisateurs
                string[] TableHeader = new string[numcells];
                //utilisé pour parcourir ligne par ligne l'objet retourné par le service web 
                string[] UserItem;
                //nb de lignes du tableau
                int numrows = listeUsers.Length + 1;
                TableRow r;
                // Récupération des données depuis le tableau 
                for (int index = 0; index < listeUsers.Length; index++)
                {
                    // Obtient le user suivant
                    UserItem = (string[])listeUsers[index];
                    // remplissage du tableau
                    r = new TableRow();
                    for (int i = 0; i < numcells; i++) 
                    {
                         TableCell c = new TableCell();
                         c.Controls.Add(new LiteralControl(UserItem[i]));
                         r.Cells.Add(c);
                    }
                    // Ajout de mes boutons de déconnexion
                    button deconnectUser= new Button();
                    deconnectUser.ID=UserItem[0] //ID du user
                    
                    //Comment associer une fonction
    deconnectUser_Click à mon bouton deconnectUser que je viens de créer ????
                    
                    TableCell c = new TableCell();
                    c.Controls.Add(deconnectuser);
                    r.Cells.Add(c);
                    header.Rows.Add(r);
                }
            }
        }
    }
    Merci d'avance pour vos réponses!!

  5. #5
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Et pourquoi le code suivant ne fonctionne pas ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    this.button1.Click += new System.EventHandler(this.button1_Click);
    private void button1_Click(object sender, EventArgs e)
        {...}

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Si je met ce code dans la fonction InitializeComponent(), ce la ne marche pas car cette fonction semble n'initialiser que les composant déclaré en "dur" dans la page .aspx. Il n'ya aucun effet quand je clique sur bouton

    Et si je met ce code à la suite de la création du bouton, il génère une erreur à la compilation sur le "this.button1", il ne reconnait pas button1 comme élément appartenant à la classe.

  7. #7
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Il ne faut surtout pas toucher à InitializeComponent, qui est une méthode générée par Visual Studio.

    Pour la solution proposée par ppphil, il te suffit d'enlever le this :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void ButtonCreation()
    {
        Button button1 = new Button();
        button1.Click += new System.EventHandler(this.button1_Click);
        this.Controls.Add(button1);
    }
     
    private void button1_Click(object sender, EventArgs e)
    {...}

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    j'ai essayé cettes solution mais ça ne marche toujours pas.

    J'ai pris un exemple plus simple :

    J'ai un bouton en dur qui créé un bouton de manière dynamique lorsque je clique dessus.

    Le bouton en dur affiche un texte dans un label lorsqu'on clqiue dessus.

    le bouton créé dynamiquement est censé afficher un texte différent dans le même label mais ça ne marche pas.

    Quand je clique sur mon bouton créé dynamiquement il disparait et l'action attendue n'est pas réalisée : rien ne s'écrit dans le label.


    Voci le code de la 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
     
    <%@ Page language="c#" Codebehind="FormTest.aspx.cs" AutoEventWireup="false" Inherits="CallBrokerServices.FormTest" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
    	<HEAD>
    		<title>CONSOLE ADMINISTRATION MATISSE</title>
    		<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
    		<meta name="CODE_LANGUAGE" Content="C#">
    		<meta name="vs_defaultClientScript" content="JavaScript">
    		<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    	</HEAD>
    	<body MS_POSITIONING="GridLayout">
     
    		<form id="Form1" method="post" runat="server">
    			<asp:LinkButton id="afficheDur" style="LEFT: 344px; POSITION: absolute; TOP: 20.26%" runat="server" Text="affiche en dur" Width="108px"></asp:LinkButton>
    			<asp:label ID="message" style="LEFT: 33%; POSITION: absolute; TOP: 5px" runat="server" Font-Name="arial"></asp:label>
    			<asp:Table id=header border=1 Runat=server style="LEFT: 10%; POSITION: absolute; TOP: 500px" Width=80% >
    			</asp:Table>
    			</form>
    	</body>
    </HTML>
    Voici le code de la 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
     
     
    namespace CallBrokerServices
    {
    	/// <summary>
    	/// This page allow to test GetSessions and KillSessions methods provided by ServiceBA (Administration)
    	/// Do not forget to change references in Web references !
    	/// </summary>
    	public class FormTest : System.Web.UI.Page
    	{
     
    		protected System.Web.UI.WebControls.LinkButton afficheDur;
    		protected System.Web.UI.WebControls.Label message;
    		protected System.Web.UI.WebControls.Table header;
     
     
     
    		private void Page_Load(object sender, System.EventArgs e)
    		{
    			// Put user code to initialize the page here
    			if(!IsPostBack)
    			{
     
    				afficheDur.Visible=true;
    				message.Visible=true;
    			}
    		}
     
    		#region Web Form Designer generated code
    		/// <summary>
    		/// generated by default => no modification here
    		/// </summary>
    		/// <param name="e"></param>
    		override protected void OnInit(EventArgs e)
    		{
    			//
    			// CODEGEN: This call is required by the ASP.NET Web Form Designer.
    			//
    			InitializeComponent();
    			base.OnInit(e);
    		}
     
    		/// <summary>
    		/// Required method for Designer support - do not modify
    		/// the contents of this method with the code editor.
    		/// Automaticly generated
    		/// </summary>
    		private void InitializeComponent()
    		{   
    			this.Load += new System.EventHandler(this.Page_Load);
    			this.afficheDur.Click +=new System.EventHandler(this.afficheDur_Click);
     
     
     
    		}
     
    		#endregion
     
     
     
     
    		//
    		private void afficheDur_Click(object sender, System.EventArgs e)
    		{
    			message.Text+=" lala ";
         		ButtonCreation();
     
    		}
     
    		private void ButtonCreation()
    		{
    			Button monBouton = new Button();
    			monBouton.ID = "monBouton";
    			monBouton.Text="affiche Dynamique";
    			monBouton.Visible=true;
    			this.Controls.Add(monBouton);
    			monBouton.Click +=new System.EventHandler(this.monBouton_Click);
    			TableRow r= new TableRow();
    			TableCell c = new TableCell();
    			c.Controls.Add(monBouton);
    			r.Cells.Add(c);
    			header.Rows.Add(r);
    		}
     
     
     
    		private void monBouton_Click(object sender, System.EventArgs e)
    		{
    			message.Text+=" oooo ";
    		}
     
     
    	}
    	//fin de la classe
     
    }
    //fin namespace
    J'ai lu sur d'autres forums que la création dynamique de boutons devait se faire dans le Page_Load ... Mais cela ne marche pas non plus et de toutes les manières ça ne me convient pas ... je cherche une solution ou mes boutons sont créés lors de du click d'un autre bouton qui a été créé en "dur" au préalable.

    pour info j'utilise la version 1.1 de .net

    Merci pour vos réponses ;-)

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut IDEM
    Bonjour,

    J'ai exactement le même problème que toi.

    As-tu trouvé une solution ?

    Je dispose d'un formulaire qui ne contient qu'une table.
    <asp:Table ... />
    Selon une certaines action sur ma page (le changement d'index sur un DropDownList) j'affiche mon formulaire auquel j'ajoute une ligne qui contient un bouton.
    J'ai donc une table avec une ligne qui contient un bouton.

    Ce bouton est donc généré dynamiquement et j'aimerai pouvoir faire quelque chose lorsque je clique dessus. En l'occurence, c'est un bouton 'Ajouter' qui me permettrai d'ajouter une nouvelle ligne (identique) à mon formulaire.


    J'hésite à poser mon formulaire en dur dans mon code asp en visible="false" et n'afficher que les lignes qui m'intéressent car comme toi je ne sais pas comment récupérer le "click" d'un bouton généré dynamiquement.
    Les solutions que j'ai testé et qui ont été présentés ici m'ont donné exactement les mêmes erreurs.

    Qu'en est-il du problème et de sa solution ?

Discussions similaires

  1. Est il possible de lier une macro à un bouton ?
    Par rimbaut dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 05/08/2007, 08h17
  2. Réponses: 15
    Dernier message: 24/01/2007, 12h54
  3. Réponses: 2
    Dernier message: 17/08/2006, 14h50
  4. Est-il possible de sélectionner une valeur d'un menu déroula
    Par pontus21 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/05/2005, 09h44
  5. Réponses: 3
    Dernier message: 29/07/2003, 09h38

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