У меня есть datagridview в приложении .NET winform. Я хочу щелкнуть правой кнопкой мыши по строке, и появится всплывающее меню. Затем я хотел бы выбрать такие вещи, как копирование, проверка и т. Д.
Как сделать A) всплывающее меню B) найти строку, по которой щелкнули правой кнопкой мыши. Я знаю, что могу использовать selectedIndex, но могу щелкнуть правой кнопкой мыши, не меняя то, что выбрано? прямо сейчас я мог бы использовать выбранный индекс, но если есть способ получить данные без изменения того, что выбрано, то это было бы полезно.
m.Show(dataGridView1.PointToScreen(e.Location));
Хотя это старый вопрос, ответов на него нет. Контекстные меню имеют собственные события в DataGridView. Есть событие для контекстного меню строки и контекстного меню ячейки.
Причина, по которой эти ответы неверны, заключается в том, что они не учитывают разные схемы работы. Параметры специальных возможностей, удаленные подключения или перенос Metro / Mono / Web / WPF могут не работать, а сочетания клавиш не будут работать вправо (Shift + F10 или клавиша контекстного меню).
Выбор ячейки при щелчке правой кнопкой мыши выполняется вручную. Отображение контекстного меню не требует обработки, поскольку это обрабатывается пользовательским интерфейсом.
Это полностью имитирует подход, используемый Microsoft Excel. Если ячейка входит в выбранный диапазон, выбор ячеек не изменяется, и тоже
CurrentCell
. Если это не так, старый диапазон очищается, а ячейка выбирается и становитсяCurrentCell
.Если вам непонятно,
CurrentCell
где именно клавиатура фокусируется при нажатии клавиш со стрелками.Selected
является ли оно частьюSelectedCells
. Контекстное меню будет отображаться при щелчке правой кнопкой мыши, как обрабатывается пользовательским интерфейсом.Сочетания клавиш по умолчанию не отображают контекстное меню, поэтому мы должны добавить их.
Я переработал этот код для статической работы, поэтому вы можете копировать и вставлять их в любое событие.
Ключ должен использовать,
CellContextMenuStripNeeded
так как это даст вам контекстное меню.Вот пример использования
CellContextMenuStripNeeded
котором вы можете указать, какое контекстное меню показывать, если вы хотите, чтобы в каждой строке были разные.В этом контексте
MultiSelect
естьTrue
иSelectionMode
естьFullRowSelect
. Это просто пример, а не ограничение.источник
The CellContextMenuStripNeeded event occurs only when the DataGridView control DataSource property is set or its VirtualMode property is true.
Используйте
CellMouseDown
событие вDataGridView
. Из аргументов обработчика событий вы можете определить, какая ячейка была нажата. ИспользуяPointToClient()
метод DataGridView, вы можете определить относительное положение указателя на DataGridView, чтобы вы могли вывести всплывающее меню в правильном месте.(
DataGridViewCellMouseEvent
Параметр просто дает вамX
иY
относительно ячейки, которую вы щелкнули, что не так просто использовать для вызова контекстного меню.)Это код, который я использовал для определения положения мыши, а затем для настройки положения DataGridView:
Весь обработчик событий выглядит так:
источник
(sender as DataGridView)[e.ColumnIndex, e.RowIndex];
для более простого вызова ячейки.ContextMenuStrip
CellContextMenuStripNeeded
e.ColumnIndex
,e.RowIndex
.Я считаю, что
e.RowIndex
это то, о чем вы просите.Предложение: когда пользователь запускает ваше событие
CellContextMenuStripNeeded
, используйтеe.RowIndex
для получения данных из вашей сетки, таких как идентификатор. Сохраните идентификатор как элемент тега события меню.Теперь, когда пользователь действительно щелкает ваш пункт меню, используйте свойство Sender для получения тега. Используйте тег, содержащий ваш ID, чтобы выполнить необходимое действие.
источник
CellContextMenuStripNeeded
обработчика событий сделайте это.if(e.RowIndex >= 0){e.ContextMenuStrip = yourContextMenuInstance;}
Это будет означать, что меню отображается только при щелчке правой кнопкой мыши по допустимой строке (т.е. не в заголовке или пустой области сетки)CellContextMenuStripNeeded
работает только в том случае, если ваш DGV привязан к источнику данных или если его VirtualMode установлен в значение true. В других случаях вам нужно будет установить этот тег вCellMouseDown
событии. Чтобы быть в безопасности, выполнитеDataGridView.HitTestInfo
в обработчике событий MouseDown, чтобы проверить, что вы находитесь в ячейке.Просто перетащите компонент ContextMenu или ContextMenuStrip в свою форму и визуально спроектируйте его, а затем назначьте его свойству ContextMenu или ContextMenuStrip желаемого элемента управления.
источник
Следуйте шагам:
Создайте контекстное меню, например:
Пользователь должен щелкнуть правой кнопкой мыши по строке, чтобы открыть это меню. Нам нужно обработать событие _MouseClick и событие _CellMouseDown.
selectedBiodataid - это переменная, которая содержит информацию о выбранной строке.
Вот код:
и результат будет:
источник
Что касается позиции для контекстного меню, y обнаружил проблему, связанную с тем, что мне нужно, чтобы она относилась к DataGridView, а событие, которое мне нужно было использовать, дает отравление по отношению к нажатой ячейке. Я не нашел лучшего решения, поэтому реализовал эту функцию в классе commons, поэтому вызываю ее откуда угодно.
Он достаточно проверен и работает хорошо. Надеюсь, вы сочтете это полезным.
источник