3 votes

Le menu contextuel de Datagridview montre toujours -1 dans hittest

Je suis en train de créer un menu contextuel pour un datagridview. J'ai essayé quelques exemples d'ici mais je ne comprends pas pourquoi le code ci-dessous renvoie toujours -1 pour n'importe quelle ligne cliquée. Il s'agit de winforms et la grille est remplie à partir d'une table de données. Que est-ce que je fais mal ici?

 DataGridView.HitTestInfo hit = dgvResults.HitTest(e.X, e.Y);

Mon code:

private void dgvResults_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
  if (e.ColumnIndex >= 0 && e.RowIndex >= 0 && e.Button == MouseButtons.Right)
  {
      DataGridView.HitTestInfo hit = dgvResults.HitTest(e.X, e.Y); \\ cela montre toujours -1
      if (hit.Type == DataGridViewHitTestType.Cell)
      {
         dgvResults.CurrentCell = dgvResults[hit.ColumnIndex, hit.RowIndex];
         cmsResults.Show(dgvResults, e.X, e.Y);
      }
  }
}

Quand j'utilise l'événement MouseClick, cela semble fonctionner, je suis un peu perdu ici

private void dgvResults_MouseClick(object sender, MouseEventArgs e)
{
  if (e.Button == MouseButtons.Right)
  {
    int currentMouseOverRow = dgvResults.HitTest(e.X, e.Y).RowIndex;
    cmsResults.Show(dgvResults, new Point(e.X, e.Y));
  }
}

Éditer:

J'ai enfin réussi à le faire fonctionner avec le code ci-dessous.

Merci à tous

Code qui a fonctionné pour moi:

private void dgvResults_MouseClick(object sender, MouseEventArgs e)
{
  if (e.Button == MouseButtons.Right)
   {
      int currentMouseOverRow = dgvResults.HitTest(e.X, e.Y).RowIndex;
      dgvResults.ClearSelection();
      if (currentMouseOverRow >= 0) // va afficher le menu contextuel s'il n'est pas négatif
      {
          dgvResults.Rows[currentMouseOverRow].Selected = true;
          cmsResults.Show(dgvResults, new Point(e.X, e.Y));
          row = currentMouseOverRow;
       }
   }
}

2voto

Mike Points 131

Regardez -

http://bytes.com/topic/c-sharp/answers/826824-invalid-coordinates-datagridview-hittest

En particulier -

Point p = dataGridView2.PointToClient(new Point(e.X, e.Y);
DataGridView.HitTestInfo info = dataGridView2.HitTest(p.X, p.Y);
int row = info.RowIndex;

2voto

Nogard Points 1739

Ceci est un comportement normal car les coordonnées X et Y retournées par EventArgs sont relatives au coin supérieur gauche du contrôle hôte :

  • MouseEventArgs retourne les coordonnées X/Y relatives au contrôle DataGridView.
  • DataGridViewCellMouseEventArgs retourne les coordonnées X/Y relatives au contrôle DataGridViewCell.

HitTest est effectué contre le contrôle DataGridView et convertit simplement les X/Y fournis en Index de Colonne/Ligne sans aucune modification.

L'illustration ci-dessous illustre l'idée (en Bleu - les valeurs retournées par MouseEventArgs, en Vert - par DataGridViewCellMouseEventArgs)

description de l'image

0voto

Adrian Points 333

J'ai enfin réussi à le faire fonctionner avec le code ci-dessous.

private void dgvResults_MouseClick(object sender, MouseEventArgs e)
{
  if (e.Button == MouseButtons.Right)
  {
    int currentMouseOverRow = dgvResults.HitTest(e.X, e.Y).RowIndex;
    dgvResults.ClearSelection();
    if (currentMouseOverRow >= 0) // affichera le menu contextuel s'il n'est pas négatif
    {
      dgvResults.Rows[currentMouseOverRow].Selected = true;
      cmsResults.Show(dgvResults, new Point(e.X, e.Y));
       row = currentMouseOverRow;
    }
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X