2016-07-21 4 views
2

Я посмотрел вокруг довольно долгое время, пытаясь найти рабочее решение, но я прибегая к задает вопрос:C# открытие ContextMenu в местоположении справа DataGridView Нажмите

У меня есть DataGridView в форме диалогового окна, в моем app, что я хочу, чтобы ContextMenu отображался в правой клавише ячейки.

У меня есть правый щелчок, и ContextMenu выглядит прекрасно, однако независимо от того, какое решение на StackExchange я пытаюсь, оно всегда достаточно смещено.

Связано ли это с формой и/или ее родителем? Или я просто тупо теряю что-то здесь?

Благодаря Джейми

Form.cs

private void dataGridContents_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     if (e.RowIndex > -1 && e.ColumnIndex > -1) 
     { 
      Debug.WriteLine("Cell right clicked!"); 

      DataGridViewCell cell = (sender as DataGridView)[e.ColumnIndex, e.RowIndex]; 

      contextCell.Show(cell.DataGridView, PointToClient(Cursor.Position)); 

      if (!cell.Selected) 
      { 
       cell.DataGridView.ClearSelection(); 
       cell.DataGridView.CurrentCell = cell; 
       cell.Selected = true; 
      } 
     } 
    } 
} 

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

К сожалению, я попытался:

  • new Point(e.X, e.Y)
  • new Point(e.Location.X, e.Location.Y)
  • new Point(MousePosition.X, MousePosition.Y)
  • PointToClient(e.X, e.Y)
  • new Point(Cursor.Position.X, Cursor.Position.Y)
  • Control.MousePosition
  • Cursor.Position

и, возможно, некоторые другие.

Edit 2

Это то, что я имею в виду смещение - некоторые решения вызывают это смещение варьировать в определенных величинах (некоторые действительно далеко и т.д.) - но все компенсируется, как те, из фактический курсор.

enter image description here

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

Мои contextCell является new ContextMenu()

+0

Что вы имеете в виду смещение? Как в контексте не появляется, где находится курсор? – TheValyreanGroup

+0

Я отредактировал скриншот :) Но да - смещение от курсора –

+1

Если вы используете ContextMenuStrip, попробуйте 'contextCell.Show (Cursor.Position);' – LarsTech

ответ

2

Вариант 1: Самое простое решение для отображения контекстного меню для строк назначая контекстное меню для RowTemplate.ContextMenuStrip собственности от DataGridView:

dataGridView1.RowTemplate.ContextMenuStrip = contextMenuStrip1; 

Вариант 2: Кроме того, если вы хотите, чтобы выбрать ячейку перед показом ContextMenuStrip, этого достаточно, чтобы справиться CellContextMenuStripNeeded событие:

private void dataGridView1_CellContextMenuStripNeeded(object sender, 
    DataGridViewCellContextMenuStripNeededEventArgs e) 
{ 
    if (e.RowIndex > -1 && e.ColumnIndex > -1) 
    { 
     dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex]; 
     e.ContextMenuStrip = contextMenuStrip1; 
    } 
} 

Какова была ваша ошибка?

Вы неправильно вычисляете положение мыши на DataGridView. Вы используете PointToClient, что означает this.PointToClient, в то время как вам нужно использовать метод DataGridView, например dataGridView1.PointToClient:

myContextMenu.Show(dataGridView1,dataGridView1.PointToClient(Cursor.Position)); 

Просто для информации, которую вы можете просто показать ContextMenu с помощью этого кода, и нет необходимости использовать ContextMenuStrip.

Но я настоятельно рекомендую использовать ContextMenuStrip.

0

Ответ должен был сделать contextCell a ContextMenuStrip вместо ContextMenu было.

После всего этого ........

Спасибо за ответы.

+0

Я описал, что было вашей ошибкой. Прочтите это в ответ:) –

+0

Да, круто спасибо: метод PointToClient был всего лишь одним из способов, которым я пытался - я уверен, что каждый метод, который я мог бы использовать, - но ответ заключался только в том, чтобы сделать его ContextMenuStrip вместо ContextMenu и прикрепить этот ContextMenuStrip к DataGridView и тогда мне даже не нужно было устанавливать его местоположение - он работал нормально сразу :) –

+0

Кажется, вы не под что я сказал в ответ. Вы также можете показать «ContextMenu». Но вы должны использовать правильную позицию. Ваша ошибка заключалась в простом неправильном положении.Очевидно, вы также можете показать «ContextMenu» и использовать «ContextMenuStrip» не обязательно! –

1

или

this.dataGridView1.ContextMenuStrip = this.contextMenuStrip1; 

и обрабатывать DataGridView.CellContextMenuStripNeededEvent

Смежные вопросы