C # - DatagridView и ContextMenu - PullRequest
       29

C # - DatagridView и ContextMenu

9 голосов
/ 04 мая 2011

У меня есть датагридвью, где я показываю информацию о продуктах.Я хочу связать контекстное меню, когда пользователь выбирает ячейку и затем щелкает правой кнопкой мыши по этой ячейке.У меня есть другое контекстное меню, и оно привязано к столбцам таблицы данных.Если пользователь щелкнет правой кнопкой мыши по столбцу, появится контекстное меню.

Я пробовал вот так, но это не работает.Контекстное меню показывает, когда пользователь щелкает правой кнопкой мыши по ячейке, но контекстное меню, связанное с заголовком столбца, не работает.

   private void GridView1_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            productContextMenu.Show(GridView1, e.Location);
        }

    }

Как мне сделать так, чтобы, когда пользователь щелкает правой кнопкой мыши по представлению сетки данных?

Заранее большое спасибо.

РЕДАКТИРОВАТЬ

Спасибо за ответы.Я решил проблему следующим образом:

    private void GridView1_MouseUp(object sender, MouseEventArgs e)
    {
        DataGridView.HitTestInfo hitTestInfo;
        if (e.Button == MouseButtons.Right)
        {
            hitTestInfo = GridView1.HitTest(e.X, e.Y);
            if (hitTestInfo.Type == DataGridViewHitTestType.Cell)
            {
                productContextMenu.Show(GridView1, e.Location);
            }

        }
    }

Оба контекстных меню показывают.Когда я щелкаю по столбцу, отображается контекстное меню, а когда я щелкаю по ячейке, отображается контекстное меню.

Ответы [ 2 ]

12 голосов
/ 04 мая 2011

Попробуйте это

 private void dataGridView1_CellMouseDown(object sender, MouseEventArgs e)
{
  if (e.Button == MouseButtons.Right)
  {
        contextMenu.Show(datagridview, e.Location);
  }

} 

или

 private void dataGridView_MouseUp(object sender, MouseEventArgs e)
 {
   // Load context menu on right mouse click
   DataGridView.HitTestInfo hitTestInfo;
   if (e.Button == MouseButtons.Right)
   {
      hitTestInfo = dataGridView.HitTest(e.X, e.Y);
      // If column is first column
      if (hitTestInfo.Type == DataGridViewHitTestType.Cell && hitTestInfo.ColumnIndex == 0)
        contextMenuForColumn1.Show(dataGridView, new Point(e.X, e.Y));
    // If column is second column
      if (hitTestInfo.Type == DataGridViewHitTestType.Cell && hitTestInfo.ColumnIndex == 1)
        contextMenuForColumn2.Show(dataGridView, new Point(e.X, e.Y));
   }
} 
1 голос
/ 15 октября 2013

Для проблемы с относительным положением вы также можете использовать этот подход:

DataGridViewColumn dgvC = new DataGridViewColumn();
DataGridViewRow dgvR = new DataGridViewRow();
dgvC = dgv.Columns[e.ColumnIndex];
dgvR = dgv.Rows[e.RowIndex];
Point p = new Point();
p.X = (dgvC.Width * e.ColumnIndex) + e.X;
p.Y = (dgvR.Height * e.RowIndex) + e.Y;
dgv.ContextMenu.Show(dgv, p);
...