Vous avez ajouté un bouton à votre DataGridView
et vous voulez exécuter un code lorsqu'il est cliqué.
C'est facile - il suffit de suivre les étapes suivantes :
A ne pas faire
D'abord, voici ce que PAS à faire :
J'éviterais les suggestions formulées dans certaines des autres réponses ici et même celles fournies par la Commission européenne. documentation à MSDN pour coder en dur l'index de la colonne ou le nom de la colonne afin de déterminer si un bouton a été cliqué. L'événement de clic s'enregistre pour la grille entière, donc d'une manière ou d'une autre vous devez déterminer qu'un bouton a été cliqué, mais vous ne devez pas le faire en supposant que votre bouton se trouve dans un nom de colonne ou un index particulier... il y a un moyen plus facile...
Faites également attention à l'événement que vous voulez gérer. Encore une fois, la documentation et de nombreux exemples se trompent à ce sujet. La plupart des exemples gèrent l'événement CellClick
qui se déclenchera :
lorsqu'une partie quelconque d'une cellule est cliquée.
...mais se déclenchera également lorsque le rangée est cliqué. Cela nécessite l'ajout de code supplémentaire simplement pour déterminer si l'élément e.RowIndex
est inférieure à 0
Traitez plutôt le CellContentClick
qui se produit uniquement :
lorsque le contenu d'une cellule est cliqué
Pour une raison quelconque, le colonne est également considéré comme du "contenu" dans une cellule. Nous devrons donc vérifier ce point ci-dessous.
Dos
Voici donc ce que vous devez faire :
D'abord, moulage l'expéditeur à taper DataGridView
pour exposer ses propriétés internes au moment de la conception. Vous pouvez modifier le type du paramètre, mais cela peut parfois compliquer l'ajout ou la suppression de gestionnaires.
Ensuite, pour savoir si un bouton a été cliqué, il suffit de vérifier que la colonne qui déclenche l'événement est de type DataGridViewButtonColumn
. Parce que nous avons déjà attribué à l'expéditeur le type DataGridView
on peut obtenir le Columns
et sélectionnez la colonne actuelle en utilisant e.ColumnIndex
. Ensuite, vérifiez si cet objet est de type DataGridViewButtonColumn
.
Bien sûr, si vous devez faire la distinction entre plusieurs boutons par grille, vous pouvez alors sélectionner sur la base du nom ou de l'index de la colonne, mais cela ne doit pas être votre première vérification. Vérifiez toujours qu'un bouton a été cliqué en premier lieu, puis traitez tout le reste de manière appropriée. Dans la plupart des cas où vous n'avez qu'un seul bouton par grille, vous pouvez vous lancer directement dans les courses.
Tout mettre en place :
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 vous amuser un peu, vous pouvez ajouter votre propre événement qui sera déclenché chaque fois que vous cliquez sur un bouton dans la grille de données. Vous ne pouvez pas l'ajouter à la grille 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 déclencher au moment opportun. C'est un peu plus de code, mais l'avantage est que vous avez séparé ce que vous voulez faire quand un bouton est cliqué de la façon de déterminer si un bouton a été cliqué.
Il suffit de déclarer un événement, de le déclencher au moment opportun et de le gérer. Cela 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 - Grille étendue
Ce qui serait génial, c'est que nous travaillions avec une grille qui fasse tout simplement ces choses pour nous. Nous pourrions répondre facilement à la question initiale : you've added a button to your DataGridView and you want to run some code when it's clicked
. Voici une approche qui étend le DataGridView
. Cela ne vaut peut-être pas la peine de devoir fournir un contrôle personnalisé avec chaque bibliothèque, mais au moins cela permet de réutiliser au maximum le code utilisé pour déterminer si un bouton a été cliqué.
Il suffit de l'ajouter à votre montage :
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. N'y touchez plus jamais. Assurez-vous que votre DataGrid est de type DataGridViewExt
qui devrait fonctionner exactement de la même manière qu'un DataGridView. Sauf qu'il soulèvera également 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
1 votes
Ajoutez-vous le bouton de façon programmatique (ce qui, je le soupçonne, est la seule façon) ?
0 votes
Il existe de nombreuses réponses à cette question en ligne. Qu'est-ce qui vous pose problème en particulier ?
1 votes
@Joshua J'ai trouvé de nombreuses réponses sur le net mais je n'ai pas vraiment eu d'idée sur ce qu'il faut faire et quand commencer. J'ai ajouté un bouton dans mon datagridview mais je ne sais pas comment gérer son événement de clic.
0 votes
eggheadcafe.com/community/csharp/2/10093214/