click droit menu contextuel pour datagridview
J'ai un datagridview dans un .NET winform app. Je voudrais faire un clic droit sur une ligne et d'avoir un menu pop-up. Ensuite, je voudrais sélectionner les choses telles que la copie, de valider, etc
Comment puis-je faire Un) un menu pop-up B) trouver la ligne qui a été cliqué avec le bouton droit. Je sais que je pourrais utiliser selectedIndex mais je devrais être en mesure de faire un clic droit sans changer ce qui est sélectionné? maintenant je pouvais utiliser l'index sélectionné, mais si il y a un moyen d'obtenir les données sans modifier ce qui est sélectionné alors que ce serait utile.
InformationsquelleAutor | 2009-11-11
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le CellMouseEnter et CellMouseLeave pour suivre le nombre de ligne que la souris est actuellement planant au-dessus.
Ensuite utiliser un objet ContextMenu à l'écran de menu contextuel, personnalisé pour la ligne en cours.
Voici un rapide exemple de ce que je veux dire...
m.Show(dataGridView1.PointToScreen(e.Location));
Alors que cette question est ancienne, les réponses ne sont pas correcte. Les menus contextuels ont leurs propres événements sur DataGridView. Il y a un événement pour la ligne de menu de contexte et de la cellule du menu contextuel.
La raison pour laquelle ces réponses ne sont pas correcte, c'est qu'ils ne tiennent pas compte des différents régimes de fonctionnement. Les options d'accessibilité, les connexions à distance, ou en Métro/Mono/Web/WPF portage pourrait ne pas fonctionner et les raccourcis clavier sera en bas à droite de l'échec (Maj+F10 ou le Menu Contextuel de la clé).
De sélection de cellule sur le bouton droit de la souris doit être traité manuellement. Montrant le menu contextuel n'a pas besoin d'être traité comme cela est géré par l'INTERFACE utilisateur.
Cette imite complètement l'approche utilisée par Microsoft Excel. Si une cellule est une partie d'une plage sélectionnée, la sélection de cellule ne change pas et ni ne
CurrentCell
. Si elle n'est pas, la plage ancienne est effacée et la cellule est sélectionnée et devientCurrentCell
.Si vous ne sont pas claires sur ce,
CurrentCell
est où le clavier est activé lorsque vous appuyez sur les touches fléchées.Selected
est de savoir si c'est une partie deSelectedCells
. Le menu contextuel s'afficher sur la droite, cliquez sur comme géré par l'INTERFACE utilisateur.Raccourcis clavier ne pas afficher le menu contextuel par défaut, de sorte que nous avons à ajouter dans.
J'ai retravaillé ce code fonctionne de manière statique, de sorte que vous pouvez les copier et les coller dans n'importe quel événement.
La clé est d'utiliser
CellContextMenuStripNeeded
car cela vous donnera le menu contextuel.Voici un exemple d'utilisation
CellContextMenuStripNeeded
où vous pouvez spécifier le menu contextuel pour afficher si vous voulez avoir différents par ligne.Dans ce contexte
MultiSelect
estTrue
etSelectionMode
estFullRowSelect
. C'est juste pour l'exemple et non pas une limitation.The CellContextMenuStripNeeded event occurs only when the DataGridView control DataSource property is set or its VirtualMode property is true.
Utiliser le
CellMouseDown
de l'événement sur laDataGridView
. À partir du gestionnaire d'événement arguments que vous pouvez déterminer qui de la cellule a été cliqué. À l'aide de laPointToClient()
méthode sur le DataGridView, vous pouvez déterminer la position relative du pointeur à la DataGridView, de sorte que vous pouvez faire apparaître le menu à l'emplacement correct.(Le
DataGridViewCellMouseEvent
paramètre vous donne juste l'X
etY
par rapport à la cellule sur laquelle vous avez cliqué, ce qui n'est pas aussi facile à utiliser pour afficher le menu contextuel.)C'est le code que j'ai utilisé pour obtenir la position de la souris, puis ajuster la position de la DataGridView:
L'ensemble du gestionnaire d'événement ressemble à ceci:
(sender as DataGridView)[e.ColumnIndex, e.RowIndex];
pour un simple appel à la cellule.ContextMenuStrip
CellContextMenuStripNeeded
e.ColumnIndex
,e.RowIndex
.Je crois que
e.RowIndex
est ce que vous demandez.Suggestion: lorsque l'utilisateur les causes de votre événement
CellContextMenuStripNeeded
d'incendie, utilisere.RowIndex
pour obtenir des données à partir de votre grille, telles que l'ID. Stocker l'ID de l'événement de menu de l'étiquette de l'élément.Maintenant, lorsque l'utilisateur clique sur votre élément de menu, utilisez la propriété Expéditeur pour aller chercher la balise. L'utilisation de la balise, contenant votre IDENTIFIANT, pour effectuer l'action que vous avez besoin.
CellContextMenuStripNeeded
gestionnaire d'événement neif(e.RowIndex >= 0){e.ContextMenuStrip = yourContextMenuInstance;}
Cela signifie que le menu n'est affiché sur la droite en cliquant sur une ligne valide, (c'est à dire pas sur un titre ou un vide de la grille de la zone)CellContextMenuStripNeeded
ne fonctionne que si votre DGV est lié à une source de données, ou si son VirtualMode est définie sur true. Dans d'autres cas, vous aurez besoin de mettre cette balise dans leCellMouseDown
événement. Pour être sur le côté sûr, là, effectuer uneDataGridView.HitTestInfo
dans le MouseDown gestionnaire d'événements pour vérifier que vous êtes sur une cellule.Il suffit de glisser une ContextMenu ou ContextMenuStrip composant dans votre forme et de la conception visuelle, puis l'affecter à la ContextMenu ou ContextMenuStrip propriété de votre commande souhaitée.
Suivre les étapes suivantes:
Créer un menu de contexte comme:
Les besoins des utilisateurs de faire un clic droit sur la ligne pour obtenir ce menu. Nous avons besoin de gérer l'_MouseClick événement et _CellMouseDown événement.
selectedBiodataid est la variable qui contient la ligne sélectionnée de l'information.
Voici le code:
et la sortie serait:
Pour le poste pour le menu contextuel, y trouvé le problème que j'avais besoin d'un être par rapport à la DataGridView, et le cas où je nécessaire à l'utilisation des donne la poistion par rapport à la cellule cliquée. Je n'ai pas trouvé une meilleure solution, j'ai donc mis en place cette fonction dans les communes de la classe, j'ai donc appeler à partir d'où j'ai besoin.
C'est assez testé et fonctionne bien. J'Espère que vous le trouverez utile.