2010-11-22 2 views
1

Dans le projet, il existe un DataGridView.hitTest.RowIndex est toujours -1

J'ai un peu de code que je qui affiche des informations basées sur la cellule qui a été cliquée.

Mon problème est de savoir comment détecter si l'utilisateur a cliqué sur une colonne ou une ligne en-tête (autre chose qu'une cellule).

Tout cela est lié à la méthode « dataGridView1_CellMouseDown », et je suis en utilisant le HitTest pour tenter de détecter ce que l'utilisateur a cliqué, mais tout ce que je suis obtenir est « TopLeftHeader » lorsque l'utilisateur clique sur une cellule et « Aucun » partout ailleurs et l'indice de ligne est toujours aussi -1

Répondre

2

Utilisation de l'événement CellMouseDown vous donne des coordonnées par rapport à la cellule qui a été cliqué. A la place, utilisez l'événement MouseDown du contrôle, ce qui vous donnera des coordonnées basées sur le contrôle.

Voir the example on MSDN.

+0

Wow ça fonctionne. Merci! – SumSang

0

Vous pouvez toujours utiliser le gestionnaire d'événements CellMouseDown. En fait, je le trouve un peu plus propre car avec l'événement MouseDown, vous devez créer un HitTest pour obtenir la ligne sélectionnée.

Le code suivant est équivalent:

private void dgv_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
    { 
     // If right-click 
     if (e.Button == System.Windows.Forms.MouseButtons.Right) 
     { 
      // Get selected row 
      var selectedRow = dgvBatches.Rows[e.RowIndex]; 
     } 
    } 

    private void dgv_MouseDown(object sender, MouseEventArgs e) 
    { 
     // If right-click 
     if (e.Button == System.Windows.Forms.MouseButtons.Right) 
     { 
      // Get the selected row/column 
      DataGridView.HitTestInfo info = dgvBatches.HitTest(e.X, e.Y); 

      // Get selected row 
      var selectedRow = dgvBatches.Rows[info.RowIndex]; 
     } 
    } 
Questions connexes