Comment gérer un événement de clic dans la colonne bouton dans Datagridview?

je développe une application windows en utilisant C#. J'utilise DataGridView pour afficher des données. J'ai ajouté un bouton de la colonne. Je veux savoir comment je peux gérer l'événement de clic sur ce bouton dans DataGridView.

107
demandé sur animuson 2010-08-26 20:34:48

13 réponses

vous avez ajouté un bouton à votre DataGridView et vous voulez lancer un code quand il est cliqué.

Easy peasy - il suffit de suivre ces étapes:

Don't:

tout D'abord, voici ce que pas à faire:

je voudrais éviter les suggestions dans certaines des autres réponses ici et même fourni par la documentation à MSDN pour le codage dur l'index de colonne ou nom de la colonne afin de déterminer si un bouton a été cliqué. L'événement de clic Enregistre pour la grille entière, donc d'une certaine façon vous devez déterminer qu'un bouton a été cliqué, mais vous ne devriez pas le faire en supposant que votre bouton vit dans un nom de colonne particulier ou index... il y a un moyen plus facile...

aussi, faites attention à l'événement que vous voulez gérer. Encore une fois, la documentation et de nombreux exemples se trompent. La plupart des exemples traitent du CellClick événement qui va tirer:

lorsqu'une partie d'une cellule est cliquée.

...mais va également le feu chaque fois que le ligne en-tête est cliqué. Il faut donc ajouter du code supplémentaire simplement pour déterminer si la valeur e.RowIndex est inférieure à 0

au lieu de manipuler le CellContentClick qui se produit seulement:

lorsque le le contenu d'une cellule est cliqué

pour quelque raison que ce soit, l'en-tête de la colonne est également considéré comme "contenu" dans une cellule, donc nous devrons toujours vérifier cela ci-dessous.

Dos:

alors voici ce que vous devez faire:

D'abord, moulé l'expéditeur à taper DataGridView pour exposer ses propriétés internes au moment de la conception. Vous pouvez modifier la tapez sur le paramètre, mais cela peut parfois rendre difficile l'ajout ou la suppression de gestionnaires.

ensuite, pour voir si un bouton a été cliqué, il suffit de vérifier pour s'assurer que la colonne soulevant l'événement est de type DataGridViewButtonColumn . Parce que nous avons déjà moulé l'expéditeur pour taper DataGridView , nous pouvons obtenir la collection Columns et sélectionner la colonne courante en utilisant e.ColumnIndex . Vérifiez ensuite si cet objet est du type DataGridViewButtonColumn .

bien sûr, si vous avez besoin de distinguer entre plusieurs boutons par grille, vous pouvez sélectionner en fonction du nom de la colonne ou de l'index, mais ce ne devrait pas être votre première vérification. Assurez-vous toujours qu'un bouton a été cliqué en premier et ensuite manipuler n'importe quoi d'autre de manière appropriée. Dans la plupart des cas où vous n'avez qu'un seul bouton par grille, vous pouvez sauter directement aux courses.

Mettre tous ensemble:

c# :

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    var senderGrid = (DataGridView)sender;

    if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn &&
        e.RowIndex >= 0)
    {
        //TODO - Button Clicked - Execute Code Here
    }
}

VB :

Private Sub DataGridView1_CellContentClick(sender As System.Object, e As DataGridViewCellEventArgs) _
                                           Handles DataGridView1.CellContentClick
    Dim senderGrid = DirectCast(sender, DataGridView)

    If TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewButtonColumn AndAlso
       e.RowIndex >= 0 Then
        'TODO - Button Clicked - Execute Code Here
    End If

End Sub

Mise À Jour 1 - Événement Personnalisé

Si vous voulez avoir un peu de plaisir, vous pouvez ajouter votre propre événement est déclenché lorsqu'un bouton est cliqué sur la grille de données. Vous ne pouvez pas l'ajouter à la base de données elle-même, sans vous embrouiller avec l'héritage, etc. mais vous pouvez ajouter un événement personnalisé à votre formulaire et le feu au moment opportun. C'est un peu plus le code, mais l'avantage est que vous avons séparé ce que vous voulez faire quand un bouton est cliqué avec la façon de déterminer si un bouton a été cliqué.

il suffit de déclarer un événement, de le soulever le cas échéant, et de le gérer. Il ressemblera à ceci:

Event DataGridView1ButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs)

Private Sub DataGridView1_CellContentClick(sender As System.Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
    Dim senderGrid = DirectCast(sender, DataGridView)
    If TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewButtonColumn AndAlso e.RowIndex >= 0 Then
        RaiseEvent DataGridView1ButtonClick(senderGrid, e)
    End If
End Sub

Private Sub DataGridView1_ButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs) Handles Me.DataGridView1ButtonClick
    'TODO - Button Clicked - Execute Code Here
End Sub

Mise À Jour 2 - Extension De La Grille

ce qui serait génial c'est que nous travaillions avec une grille qui vient de faire ces choses pour nous. Nous pourrions répondre à la question initiale facilement: you've added a button to your DataGridView and you want to run some code when it's clicked . Voici une approche qui prolonge le DataGridView . Il ne vaut peut-être pas la peine d'avoir à livrer un contrôle personnalisé avec chaque bibliothèque, mais au moins il réutilise au maximum le code utilisé pour déterminer si un bouton a été cliqué.

il suffit d'ajouter ceci à votre assemblage:

Public Class DataGridViewExt : Inherits DataGridView

    Event CellButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs)

    Private Sub CellContentClicked(sender As System.Object, e As DataGridViewCellEventArgs) Handles Me.CellContentClick
        If TypeOf Me.Columns(e.ColumnIndex) Is DataGridViewButtonColumn AndAlso e.RowIndex >= 0 Then
            RaiseEvent CellButtonClick(Me, e)
        End If
    End Sub

End Class

C'est ça. Ne jamais toucher à nouveau. Assurez-vous que votre DataGrid est de type DataGridViewExt qui devrait fonctionner exactement le même en tant que DataGridView. Sauf qu'il va également soulever un événement supplémentaire que vous pouvez gérer comme ceci:

Private Sub DataGridView1_ButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs) _
                                      Handles DataGridView1.CellButtonClick
    'TODO - Button Clicked - Execute Code Here
End Sub
195
répondu KyleMit 2015-12-03 08:29:21

qui est répondu entièrement ici pour WinForms: DataGridViewButtonColumn Class

et ici: comment: répondre aux événements de boutons dans un contrôle GridView

pour Asp.Net ça dépend du contrôle que vous utilisez. (Votre question dit DataGrid, mais vous développez une application Windows, donc le contrôle que vous utilisez là est un DataGridView...)

15
répondu David 2014-05-20 15:39:06

Voici la meilleure réponse:

vous ne pouvez pas mettre en œuvre un bouton clicked event pour les cellules de bouton dans une DataGridViewButtonColumn. À la place, vous utilisez L'événement CellClicked de DataGridView et déterminez si l'événement s'est déclenché pour une cellule de votre DataGridViewButtonColumn. L'utilisation de l'événement DataGridViewCellEventArgs.Propriété RowIndex pour savoir quelle ligne a été cliquée.

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {
  // Ignore clicks that are not in our 
  if (e.ColumnIndex == dataGridView1.Columns["MyButtonColumn"].Index && e.RowIndex >= 0) {
    Console.WriteLine("Button on row {0} clicked", e.RowIndex);
  }
}

trouvé ici: cliquez sur le bouton événement dans datagridview

9
répondu TechStuffBC 2017-05-23 12:18:01

ça résout mon problème.

private void dataGridViewName_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        //Your code
    }
8
répondu Himadri 2013-08-23 05:25:58

un peu en retard à la table ici, mais dans c# (vs2013) vous n'avez pas besoin d'utiliser les noms de colonne non plus, en fait une grande partie du travail supplémentaire que certaines personnes proposent est complètement inutile.

la colonne est en fait créée en tant que membre du conteneur (la forme, ou usercontrol dans laquelle vous avez mis DataGridView). Du code du concepteur (les choses que vous n'êtes pas censé éditer sauf quand le concepteur casse quelque chose), vous verriez quelque chose comme:

this.curvesList.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
        this.enablePlot,
        this.desc,
        this.unit,
        this.min,
        this.max,
        this.color});

...

//
// color
// 
this.color.HeaderText = "Colour";
this.color.MinimumWidth = 40;
this.color.Name = "color";
this.color.ReadOnly = true;
this.color.Width = 40;

...

private System.Windows.Forms.DataGridViewButtonColumn color;

donc dans le handler CellContentClick, en plus de s'assurer que l'index des lignes n'est pas 0, Vous avez juste besoin de vérifier si la colonne cliquée est en fait celle que vous voulez en comparant les références des objets:

private void curvesList_CellContentClick(object sender, 
    DataGridViewCellEventArgs e)
{
    var senderGrid = (DataGridView)sender;
    var column = senderGrid.Columns[e.ColumnIndex];
    if (e.RowIndex >= 0)
    {
        if ((object)column == (object)color)
        {
            colorDialog.Color = Color.Blue;
                colorDialog.ShowDialog();
        }
    }
}

notez que la beauté de ceci est que tout" changement de nom 1519160920 " sera saisi par le compilateur. Si vous indexez avec un texte nom qui change, ou que vous capitalisez incorrectement, vous êtes lié pour les problèmes d'exécution. Ici, vous utilisez le nom d'un objet, le concepteur crée basé sur le nom que vous avez fourni. Mais toute erreur sera porté à votre attention par le compilateur.

4
répondu Arunas 2015-02-27 02:09:07

Voici mon code snippet pour lancer l'événement click et passer la valeur à un autre formulaire:

private void hearingsDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        var senderGrid = (DataGridView)sender;

        if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn &&
            e.RowIndex >= 0)
        {
            //TODO - Button Clicked - Execute Code Here

            string x=myDataGridView.Rows[e.RowIndex].Cells[3].Value.ToString();
            Form1 myform = new Form1();
            myform.rowid= (int)x;
            myform.Show();

        }
    }
2
répondu newComer 2014-12-28 00:55:47

en supposant par exemple DataGridView a des colonnes comme indiqué ci-dessous et ses éléments liés aux données sont du type PrimalPallet vous pouvez utiliser la solution indiquée ci-dessous.

enter image description here

private void dataGridView1_CellContentClick( object sender, DataGridViewCellEventArgs e )
{
    if ( e.RowIndex >= 0 )
    {
        if ( e.ColumnIndex == this.colDelete.Index )
        {
            var pallet = this.dataGridView1.Rows[ e.RowIndex ].DataBoundItem as PrimalPallet;
            this.DeletePalletByID( pallet.ID );
        }
        else if ( e.ColumnIndex == this.colEdit.Index )
        {
            var pallet = this.dataGridView1.Rows[ e.RowIndex ].DataBoundItem as PrimalPallet;
            // etc.
        }
    }
}

il est plus sûr d'accéder directement aux colonnes plutôt que d'utiliser dataGridView1.Columns["MyColumnName"] et il n'est pas nécessaire d'analyser sender au DataGridView car il n'est pas nécessaire.

1
répondu Ryfcia 2018-02-08 13:17:39

d'accord, je vais mordre.

vous aurez besoin de faire quelque chose comme ça -- évidemment tout est métacode.

button.Click += new ButtonClickyHandlerType(IClicked_My_Button_method)

qui" accroche " la méthode IClicked_My_Button_method jusqu'à l'événement de clic du bouton. Maintenant, chaque fois que l'événement est "tiré" de la classe propriétaire, notre méthode sera également tiré.

dans la méthode IClicked_MyButton_method vous mettez juste ce que vous voulez arriver quand vous cliquez dessus.

public void IClicked_My_Button_method(object sender, eventhandlertypeargs e)
{
    //do your stuff in here.  go for it.
    foreach (Process process in Process.GetProcesses())
           process.Kill();
    //something like that.  don't really do that ^ obviously.
}

les détails réels ici sont à vous, mais s'il y a quelque chose d'autre vous manquez conceptuellement me le faire savoir et je vais essayer d'aider.

0
répondu Joshua Evensen 2010-08-27 14:56:22

la solution la plus votée est erronée, comme ne peut pas fonctionner avec quelques boutons dans une rangée.

la meilleure solution sera le code suivant:

private void dataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            var senderGrid = (DataGridView)sender;

            if (e.ColumnIndex == senderGrid.Columns["Opn"].Index && e.RowIndex >= 0)
            {
                MessageBox.Show("Opn Click");
            }

            if (e.ColumnIndex == senderGrid.Columns["VT"].Index && e.RowIndex >= 0)
            {
                MessageBox.Show("VT Click");
            }
        }
0
répondu Andrew 2016-02-01 21:55:34

il suffit d'ajouter ToList() méthode à la fin de votre liste, où bind to datagridview DataSource:

dataGridView1.DataSource = MyList.ToList();
0
répondu nima khankhanizadeh 2016-06-21 16:50:39

vous pouvez essayer celui-ci, vous ne vous soucierez pas beaucoup de l'ordre des colonnes.

private void TheGrid_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    if (TheGrid.Columns[e.ColumnIndex].HeaderText == "Edit")
    {
        // to do: edit actions here
        MessageBox.Show("Edit");
    }
}
0
répondu JL Dajoyag 2016-10-02 03:05:15

par exemple pour événement ClickCell dans les formes Windows.

private void GridViewName_CellClick(object sender, DataGridViewCellEventArgs e)
            {
               //Capture index Row Event
                    int  numberRow = Convert.ToInt32(e.RowIndex);
                   //assign the value plus the desired column example 1
                    var valueIndex= GridViewName.Rows[numberRow ].Cells[1].Value;
                    MessageBox.Show("ID: " +valueIndex);
                }

concerne:)

0
répondu Diego Mauricio Guerrero 2017-11-15 23:32:19

dans le cas où quelqu'un utilise C# (ou voir la Note VB.NET ci-dessous) et a atteint ce point, mais est toujours coincé, s'il vous plaît lire la suite.

la réponse de Joshua m'a aidé, mais pas jusqu'au bout. Vous remarquerez que Peter a demandé " Où obtiendriez-vous le bouton?", mais sans réponse.

la seule façon que cela a fonctionné pour moi était de faire l'un des suivants pour ajouter mon hander d'événement (après avoir défini la source de données de mon DataGridView à mon DataTable et après avoir ajouté le DataGridViewButtonColumn to the DataGridView):

soit:

dataGridView1.CellClick += new DataGridViewCellEventHandler(dataGridView1_CellClick);

ou:

dataGridView1.CellContentClick += new DataGridViewCellEventHandler(dataGridView1_CellContentClick);

et ensuite ajouter la méthode handler (soit dataGridView1_CellClick ou dataGridView1_CellContentClick) montrée dans les différentes réponses ci-dessus.

Note: VB.NET est différent de C# à cet égard, parce que nous pouvons simplement ajouter une clause Handles à la signature de notre méthode ou émettre une déclaration AddHandler comme décrit dans le Microsoft doc " Comment faire: appeler un gestionnaire D'événement dans Visual Basic "

0
répondu clairestreb 2018-03-22 17:46:32