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 :

Générer des boutons sur des lignes d'un Datagridview ?


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 151
    Points : 87
    Points
    87
    Par défaut Générer des boutons sur des lignes d'un Datagridview ?
    Bonjour à tous

    J'aimerai savoir s'il était possible de générer des boutons, dans une colonne prévue à cet effet, dans un datagridview.
    Cela sous-entend bien entendu que le nombre de lignes, et donc de boutons, ne peux pas être connu à l'avance, puisqu'il va dépendre du nombre de lignes dans la base de données.

    Si jusque là c'est possible, j'aimerai un moyen d'associer le bouton à la première colonne du tableau (qui est un ID). Pour que je puisse ensuite traiter en fonction de quelle ligne le bouton a été cliqué.

    Ca me parait infaisable, mais avant d'abandonner je préfère demander ici, on sait jamais

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Une simple recherche google t'aurais mis sur la voie.
    https://learn.microsoft.com/fr-fr/do...ramework-4.8.1

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 151
    Points : 87
    Points
    87
    Par défaut
    Citation Envoyé par popo Voir le message
    Une simple recherche google t'aurais mis sur la voie.
    https://learn.microsoft.com/fr-fr/do...ramework-4.8.1
    Evidemment que j'ai cherché sur le net avant de poster ici, et j'avais vu aussi à propos des DataGridViewButtonColumn, sauf que ce composant n'existe pas quand je regarde dans la toolbox...

  4. #4
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Citation Envoyé par BartRoX Voir le message
    Evidemment que j'ai cherché sur le net avant de poster ici, et j'avais vu aussi à propos des DataGridViewButtonColumn, sauf que ce composant n'existe pas quand je regarde dans la toolbox...
    Citation Envoyé par BartRoX Voir le message
    Ca me parait infaisable
    Et donc comme tu l'a pas vu dans la boîte à outil, tu as décrété que c'était impossible.
    Tu n'imagine pas qu'on puisse faire autre chose que glisser-déposer .
    C'est vrai qu'écrire du code, ça ne fait pas partie de ton boulot, tout doit se faire via le designer.

    Ce composant n'apparaît pas dans la boîte à outil parce qu'il fait partie du DataGridView et se gère via le DataGridView.
    Un simple clic-droit sur la grille permet d'avoir une option pour gérer les colonnes.
    Ou sinon
    https://learn.microsoft.com/en-us/do...orkdesktop-4.8

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 151
    Points : 87
    Points
    87
    Par défaut
    Si je viens sur un forum c'est pour chercher de l'aide, pas pour me faire traiter d'imbecile incompétent. Alors veuillez rester courtois s'il vous plait, merci.

    En plus faire un clique droit sur le datagridview ne sert à rien...


    Bref, je m'y suis remis aujourd'hui et je me suis débrouillé pour faire apparaitre un bouton sur le datagridview, mais la doc est sommaire (ce qui en soit est une bonne chose, bien que l'exemple soit rempli d'info inutile qui surcharge le code pour rien, bref), et donc bien loin de répondre à ma problématique.
    Déjà j'ai trouvé comment récupérer mon ID (de ma base de données) en fonction de la ligne cliqué, c'est déjà ça. Ca ma permi d'aller jusqu'au bout dans ce que je voulais faire à ce niveau.

    Par contre j'ai un souci parce que dans l'exemple de la doc ils utilisent
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Add a CellClick handler to handle clicks in the button column.
    dataGridView1.CellClick += new DataGridViewCellEventHandler(dataGridView1_CellClick);
    Ce qui fait que peux importe la colonne où je clique sur le datagridview, l'évenement ce déclenche... Je veux bien essayé de gruger avec un if pour faire en sorte que le contenu de l'évènement ne concerne que la colonne du bouton, et encore pas si simple... Mais ça fait gros bricolage quand même, y'a pas plus logique comme méthode ? J'avoue que dans la liste il n'y a rien qui m'inspire...


    Ensuite j'ai ajouté le button.Text = "myText"; mais aucun text n'apparait sur mes boutons.
    En soit le texte que je veux est le même sur tous, mais dans l'exemple de la doc ils ont un nombre défini de lignes ce qui est différent de mon cas.
    J'ai essayé au constructeur de ma form, ou dans la fonction qui refresh le contenu du datagridview, mais c'est idem... Même dans la boucle while de récupération des données ça ne change rien.


    Pour les puristes qui veulent du code, même si j'ai testé plusieurs chose, en gros voilà ce que j'ai (valeurs et noms bidon pour l'exemple)
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private void fonctionQuiRefreshMonDatagridView ()
    {
         DataGridViewButtonColumn myButton = new DataGridViewButtonColumn();
         myButton.HeaderText = "Header";
         myButton.Name = "myButton";
         myButton.Text = "myText";
         dataGridView.Columns.Add(myButton);
         dataGridView.CellClick += new DataGridViewCellEventHandler(eventButton_Click);
     
         // Mes requêtes SQL qui ajoutent et remplissent les lignes du datagridview
    }

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 126
    Points : 1 636
    Points
    1 636
    Par défaut
    Dans le 1er lien donné par popo (https://learn.microsoft.com/fr-fr/do...ramework-4.8.1), le code exemple montre comment faire le filtrage pour ne rien faire si le click a lieu sur la colonne qui n'a pas les boutons (à adapter selon le numéro de la colonne), il montre aussi comment récupérer l'ID, et il y a aussi une ligne pour permettre l'affichage du texte du bouton
    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
     // Calls the Employee.RequestStatus method.
        void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            // Ignore clicks that are not on button cells. 
            if (e.RowIndex < 0 || e.ColumnIndex !=
                dataGridView1.Columns["Status Request"].Index) return;
     
            // Retrieve the task ID.
            Int32 taskID = (Int32)dataGridView1[0, e.RowIndex].Value;
     
            // Retrieve the Employee object from the "Assigned To" cell.
            Employee assignedTo = dataGridView1.Rows[e.RowIndex]
                .Cells["Assigned To"].Value as Employee;
     
            // Request status through the Employee object if present. 
            if (assignedTo != null)
            {
                assignedTo.RequestStatus(taskID);
            }
            else
            {
                MessageBox.Show(String.Format(
                    "Task {0} is unassigned.", taskID), "Status Request");
            }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Add a button column. 
            DataGridViewButtonColumn buttonColumn = 
                new DataGridViewButtonColumn();
            buttonColumn.HeaderText = "";
            buttonColumn.Name = "Status Request";
            buttonColumn.Text = "Request Status";
            buttonColumn.UseColumnTextForButtonValue = true;
    Le code vaut pour WinForms.

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 151
    Points : 87
    Points
    87
    Par défaut
    Mercu umfred pour ta réponse, J'ai testé pour le if qui exit en cas de clique sur une autre colonne que le bouton, ca marche. Par contre c'est ce que je disais, c'est du bricolage conditionnel. le code entre quand même dans l'évenement... Je suis surpris qu'il n'y est pas quelque chose de plus propre, mais bon, ça marche.

    Pour le texte sur le bouton, encore une fois pas tres intuitif, mais c'est parce qu'en plus de la propriete "Text" à mettre à la valeur que l'on souhaite, on doit aussi mettre
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    UseColumnTextForButtonValue = true;
    Même le nom est pas très intuitif je trouve.

    Même si ce n'est pas nécessaire dans mon cas, je serai quand même curieux de savoir comment faire si on veux un nom différent sur chaque bouton du coup

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 126
    Points : 1 636
    Points
    1 636
    Par défaut
    Citation Envoyé par BartRoX Voir le message
    Même si ce n'est pas nécessaire dans mon cas, je serai quand même curieux de savoir comment faire si on veux un nom différent sur chaque bouton du coup
    avec DataGridViewCell.Value ou plus précisément le FormattedValue , comme expliquer dans la doc https://learn.microsoft.com/en-us/do...forbuttonvalue

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

Discussions similaires

  1. Générer des lignes
    Par petitlouis dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/01/2014, 09h13
  2. Générer des lignes à partir de 2 autres lignes
    Par laloune dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 30/03/2012, 17h11
  3. [XL-2000] Lancement d'executables avec Shell, générer des lignes de commande du CMD
    Par Gautier.B dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/04/2009, 09h29
  4. générer des lignes de resultats
    Par vgaudin dans le forum Firebird
    Réponses: 7
    Dernier message: 17/04/2008, 11h49
  5. comment générer des lignes automatique
    Par kikinouqc dans le forum Modélisation
    Réponses: 7
    Dernier message: 12/02/2008, 22h36

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