3

我正在尝试为 datagridview 创建一个上下文菜单。我从这里尝试了一些示例,但无法理解为什么对于单击的任何行,下面总是返回 -1。这是一个winforms,网格是从数据表中填充的。我在这里做错了什么?

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

我的代码:

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); \\ this shows as -1 always
      if (hit.Type == DataGridViewHitTestType.Cell)
      {
         dgvResults.CurrentCell = dgvResults[hit.ColumnIndex, hit.RowIndex];
         cmsResults.Show(dgvResults, e.X, e.Y);
      }
  }
}

当我使用 MouseClick 事件时,它似乎起作用了,我有点迷失在这里

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));

  }
}

编辑:

我终于让它与下面的代码一起工作。

谢谢大家

对我有用的代码:

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) // will show Context Menu Strip if not negative
      {
          dgvResults.Rows[currentMouseOverRow].Selected = true;
          cmsResults.Show(dgvResults, new Point(e.X, e.Y));
           row = currentMouseOverRow;
       }
   }
}
4

3 回答 3

2

这是正常行为,因为 EventArgs 返回的 X 和 Y 坐标相对于宿主控件的左上角:

  • MouseEventArgs返回相对于DataGridView控件的 X/Y 坐标。
  • DataGridViewCellMouseEventArgs返回相对于DataGridViewCell控件的 X/Y 坐标。

HitTest是针对DataGridView控制执行的,只是将提供的 X/Y 转换为列/行索引,而不进行任何修改。

下面的插图演示了这个想法(蓝色 - 返回的值MouseEventArgs,绿色 - DataGridViewCellMouseEventArgs)

在此处输入图像描述

于 2013-04-05T11:57:09.610 回答
1

看着 -

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

尤其 -

Point p = dataGridView2.PointToClient(new Point(e.X, e.Y);
DataGridView.HitTestInfo info = dataGridView2.HitTest(p.X, p.Y);
int row = info.RowIndex;
于 2013-04-05T11:56:11.900 回答
0

我终于让它与下面的代码一起工作。

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) // will show Context Menu Strip if not negative
    {
      dgvResults.Rows[currentMouseOverRow].Selected = true;
      cmsResults.Show(dgvResults, new Point(e.X, e.Y));
       row = currentMouseOverRow;
    }
  }
}
于 2013-04-06T06:51:13.280 回答