Eu tenho um datagridview em um aplicativo WinForm .NET. Eu gostaria de clicar com o botão direito em uma linha e ter um menu pop-up. Então eu gostaria de selecionar coisas como copiar, validar, etc.
Como faço para A) um menu pop-up B) localizar qual linha foi clicada com o botão direito. Eu sei que poderia usar o selectedIndex, mas devo conseguir clicar com o botão direito do mouse sem alterar o que está selecionado. agora eu poderia usar o índice selecionado, mas se houver uma maneira de obter os dados sem alterar o que está selecionado, isso seria útil.
m.Show(dataGridView1.PointToScreen(e.Location));
Embora essa pergunta seja antiga, as respostas não são adequadas. Os menus de contexto têm seus próprios eventos em DataGridView. Há um evento para o menu de contexto da linha e o menu de contexto da célula.
A razão pela qual essas respostas não são adequadas é que elas não levam em consideração os diferentes esquemas de operação. As opções de acessibilidade, conexões remotas ou portabilidade Metro / Mono / Web / WPF podem não funcionar e os atalhos do teclado falharão à direita (Shift + F10 ou tecla do Menu de Contexto).
A seleção de células com o clique direito do mouse deve ser feita manualmente. Mostrar o menu de contexto não precisa ser feito, pois isso é feito pela IU.
Isso imita completamente a abordagem usada pelo Microsoft Excel. Se uma célula fizer parte de um intervalo selecionado, a seleção da célula não muda e nem muda
CurrentCell
. Se não for, o intervalo antigo é limpo e a célula é selecionada e se tornaCurrentCell
.Se você não tem certeza sobre isso,
CurrentCell
é onde o teclado tem foco quando você pressiona as teclas de seta.Selected
é se faz parte deSelectedCells
. O menu de contexto será exibido ao clicar com o botão direito conforme gerenciado pela IU.Os atalhos do teclado não mostram o menu de contexto por padrão, então temos que adicioná-los.
Eu retrabalhei esse código para funcionar estaticamente, então você pode copiá-lo e colá-lo em qualquer evento.
A chave é usar
CellContextMenuStripNeeded
pois isso fornecerá o menu de contexto.Aqui está um exemplo usando
CellContextMenuStripNeeded
onde você pode especificar qual menu de contexto mostrar se deseja ter diferentes por linha.Neste contexto
MultiSelect
éTrue
eSelectionMode
éFullRowSelect
. Isso é apenas um exemplo e não uma limitação.fonte
The CellContextMenuStripNeeded event occurs only when the DataGridView control DataSource property is set or its VirtualMode property is true.
Use o
CellMouseDown
evento noDataGridView
. A partir dos argumentos do manipulador de eventos, você pode determinar qual célula foi clicada. Usando oPointToClient()
método no DataGridView, você pode determinar a posição relativa do ponteiro para o DataGridView, para que possa abrir o menu no local correto.(O
DataGridViewCellMouseEvent
parâmetro apenas fornece oX
e emY
relação à célula em que você clicou, o que não é tão fácil de usar para abrir o menu de contexto.)Este é o código que usei para obter a posição do mouse e, em seguida, ajuste para a posição do DataGridView:
Todo o manipulador de eventos tem a seguinte aparência:
fonte
(sender as DataGridView)[e.ColumnIndex, e.RowIndex];
para uma chamada mais simples para o celular.ContextMenuStrip
CellContextMenuStripNeeded
e.ColumnIndex
,e.RowIndex
.Eu acredito que
e.RowIndex
é isso que você está pedindo.Sugestão: quando o usuário faz com que seu evento
CellContextMenuStripNeeded
seja disparado, usee.RowIndex
para obter dados de sua grade, como o ID. Armazene o ID como o item de tag do evento de menu.Agora, quando o usuário realmente clicar em seu item de menu, use a propriedade Sender para buscar a tag. Use a tag, contendo seu ID, para executar a ação que você precisa.
fonte
CellContextMenuStripNeeded
manipulador de eventos, façaif(e.RowIndex >= 0){e.ContextMenuStrip = yourContextMenuInstance;}
Isso significa que o menu é mostrado apenas ao clicar com o botão direito em uma linha válida (ou seja, não em um título ou área de grade vazia)CellContextMenuStripNeeded
só funciona se seu DGV estiver vinculado a uma fonte de dados ou se seu VirtualMode estiver definido como verdadeiro. Em outros casos, você precisará definir essa tag noCellMouseDown
evento. Para ficar no lado seguro, execute umDataGridView.HitTestInfo
no manipulador de eventos MouseDown para verificar se você está em uma célula.Basta arrastar um componente ContextMenu ou ContextMenuStrip para o seu formulário e projetá-lo visualmente e, em seguida, atribuí-lo à propriedade ContextMenu ou ContextMenuStrip do controle desejado.
fonte
Siga os passos:
Crie um menu de contexto como:
O usuário precisa clicar com o botão direito na linha para acessar este menu. Precisamos lidar com o evento _MouseClick e o evento _CellMouseDown.
selectedBiodataid é a variável que contém as informações da linha selecionada.
Aqui está o código:
e a saída seria:
fonte
Para a posição do menu de contexto, y encontrei o problema de que precisava ser relativo ao DataGridView, e o evento que eu precisava usar fornece o poistion relativo à célula clicada. Não encontrei uma solução melhor, então implementei essa função na classe comum, então a chamo de onde preciso.
É bastante testado e funciona bem. Espero que seja útil.
fonte