C # — DataGridView и ContextMenu

#c# #datagridview #contextmenu

#c# #datagridview #contextmenu

Вопрос:

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

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

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

    }
  

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

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

Редактировать

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

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

        }
    }
  

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

Комментарии:

1. Спасибо, что узнали, что вы получили ответ 🙂

2. Почему бы вам не отметить как ответ, если вы получили решение с его идеей

Ответ №1:

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

  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 amp;amp; hitTestInfo.ColumnIndex == 0)
        contextMenuForColumn1.Show(dataGridView, new Point(e.X, e.Y));
    // If column is second column
      if (hitTestInfo.Type == DataGridViewHitTestType.Cell amp;amp; hitTestInfo.ColumnIndex == 1)
        contextMenuForColumn2.Show(dataGridView, new Point(e.X, e.Y));
   }
} 
  

Комментарии:

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

2. По какой-то причине я всегда получаю столбец 0 для hitTest. Индекс столбца . Вот мой код для добавления прослушивателя: DataGridView. ColumnHeaderMouseClick = dataGridView_ColumnHeaderMouseClick; и вот определение моего прослушивателя: private void dataGridView_ColumnHeaderMouseClick (отправитель объекта, MouseEventArgs e)

Ответ №2:

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

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