J'ai un datagridview dans une application .NET winform. Je voudrais faire un clic droit sur une ligne et faire apparaître un menu. Ensuite, je voudrais sélectionner des éléments tels que copier, valider, etc.
Comment faire pour A) un menu contextuel B) trouver quelle ligne a été cliquée avec le bouton droit de la souris. Je sais que je pourrais utiliser selectedIndex mais je devrais pouvoir faire un clic droit sans changer ce qui est sélectionné? pour le moment, je pourrais utiliser l'index sélectionné, mais s'il existe un moyen d'obtenir les données sans changer ce qui est sélectionné, ce serait utile.
m.Show(dataGridView1.PointToScreen(e.Location));
Bien que cette question soit ancienne, les réponses ne sont pas correctes. Les menus contextuels ont leurs propres événements sur DataGridView. Il existe un événement pour le menu contextuel de ligne et le menu contextuel de cellule.
La raison pour laquelle ces réponses ne sont pas correctes est qu'elles ne tiennent pas compte des différents schémas d'exploitation. Les options d'accessibilité, les connexions à distance ou le portage Metro / Mono / Web / WPF peuvent ne pas fonctionner et les raccourcis clavier échoueront vers le bas à droite (Maj + F10 ou touche du menu contextuel).
La sélection de cellule par clic droit de la souris doit être gérée manuellement. L'affichage du menu contextuel n'a pas besoin d'être géré car cela est géré par l'interface utilisateur.
Cela imite complètement l'approche utilisée par Microsoft Excel. Si une cellule fait partie d'une plage sélectionnée, la sélection de cellule ne change pas et non plus
CurrentCell
. Si ce n'est pas le cas, l'ancienne plage est effacée et la cellule est sélectionnée et devientCurrentCell
.Si vous n'êtes pas clair à ce sujet,
CurrentCell
c'est là que le clavier a le focus lorsque vous appuyez sur les touches fléchées.Selected
est de savoir si cela fait partie deSelectedCells
. Le menu contextuel s'affichera lors du clic droit comme géré par l'interface utilisateur.Les raccourcis clavier n'affichent pas le menu contextuel par défaut, nous devons donc les ajouter.
J'ai retravaillé ce code pour qu'il fonctionne de manière statique, vous pouvez donc les copier et les coller dans n'importe quel événement.
La clé est à utiliser
CellContextMenuStripNeeded
car cela vous donnera le menu contextuel.Voici un exemple d'utilisation
CellContextMenuStripNeeded
où vous pouvez spécifier le menu contextuel à afficher si vous souhaitez en avoir différents par ligne.Dans ce contexte
MultiSelect
estTrue
etSelectionMode
estFullRowSelect
. Ceci est juste pour l'exemple et non une limitation.la source
The CellContextMenuStripNeeded event occurs only when the DataGridView control DataSource property is set or its VirtualMode property is true.
Utilisez l'
CellMouseDown
événement sur leDataGridView
. À partir des arguments du gestionnaire d'événements, vous pouvez déterminer sur quelle cellule l'utilisateur a cliqué. À l'aide de laPointToClient()
méthode sur le DataGridView, vous pouvez déterminer la position relative du pointeur vers le DataGridView, afin que vous puissiez afficher le menu à l'emplacement correct.(Le
DataGridViewCellMouseEvent
paramètre vous donne simplement leX
etY
relatif à la cellule sur laquelle vous avez cliqué, ce qui n'est pas aussi facile à utiliser pour faire apparaître le menu contextuel.)C'est le code que j'ai utilisé pour obtenir la position de la souris, puis ajuster la position du DataGridView:
L'ensemble du gestionnaire d'événements ressemble à ceci:
la source
(sender as DataGridView)[e.ColumnIndex, e.RowIndex];
pour un appel plus simple à la cellule.ContextMenuStrip
CellContextMenuStripNeeded
e.ColumnIndex
,e.RowIndex
.Je crois que
e.RowIndex
c'est ce que vous demandez.Suggestion: lorsque l'utilisateur
CellContextMenuStripNeeded
déclenche votre événement , utiliseze.RowIndex
pour obtenir des données de votre grille, telles que l'ID. Stockez l'ID comme élément de balise de l'événement de menu.Désormais, lorsque l'utilisateur clique sur l'élément de menu, utilisez la propriété Sender pour récupérer la balise. Utilisez la balise contenant votre identifiant pour effectuer l'action dont vous avez besoin.
la source
CellContextMenuStripNeeded
gestionnaire d'événements, celaif(e.RowIndex >= 0){e.ContextMenuStrip = yourContextMenuInstance;}
signifiera que le menu n'est affiché qu'en cliquant avec le bouton droit sur une ligne valide, (c'est-à-dire pas sur un en-tête ou une zone de grille vide)CellContextMenuStripNeeded
ne fonctionne que si votre DGV est lié à une source de données ou si son VirtualMode est défini sur true. Dans d'autres cas, vous devrez définir cette balise dans l'CellMouseDown
événement. Pour être sûr, effectuez unDataGridView.HitTestInfo
dans le gestionnaire d'événements MouseDown pour vérifier que vous êtes sur une cellule.Faites simplement glisser un composant ContextMenu ou ContextMenuStrip dans votre formulaire et concevez-le visuellement, puis affectez-le à la propriété ContextMenu ou ContextMenuStrip du contrôle souhaité.
la source
Suis les étapes:
Créez un menu contextuel comme:
L'utilisateur doit faire un clic droit sur la ligne pour obtenir ce menu. Nous devons gérer l'événement _MouseClick et l'événement _CellMouseDown.
selectedBiodataid est la variable qui contient les informations de ligne sélectionnées.
Voici le code:
et la sortie serait:
la source
Pour la position du menu contextuel, y a trouvé le problème dont j'avais besoin qu'il soit relatif au DataGridView, et l'événement que j'avais besoin d'utiliser donne la poistion par rapport à la cellule sur laquelle j'ai cliqué. Je n'ai pas trouvé de meilleure solution, j'ai donc implémenté cette fonction dans la classe commons, donc je l'appelle de partout où j'ai besoin.
C'est assez testé et fonctionne bien. J'espère que tu trouves cela utile.
la source