3

datagridview のコンテキスト メニューを作成しようとしています。here からいくつかのサンプルを試しましたが、クリックされた行に対して以下が常に-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コントロールに対する X/Y 座標を返しDataGridViewます。
  • DataGridViewCellMouseEventArgsコントロールに対する X/Y 座標を返しDataGridViewCellます。

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 に答える