Mam datagridview w aplikacji .NET winform. Chciałbym kliknąć prawym przyciskiem myszy wiersz i wyświetlić menu podręczne. Następnie chciałbym wybrać takie rzeczy, jak kopiowanie, weryfikacja itp
Jak zrobić A) wyskakujące menu B) znaleźć wiersz kliknięty prawym przyciskiem myszy. Wiem, że mogę użyć selectedIndex, ale powinienem mieć możliwość kliknięcia prawym przyciskiem myszy bez zmiany zaznaczenia? w tej chwili mógłbym użyć wybranego indeksu, ale jeśli istnieje sposób na uzyskanie danych bez zmiany tego, co jest wybrane, byłoby to przydatne.
m.Show(dataGridView1.PointToScreen(e.Location));
Chociaż to pytanie jest stare, odpowiedzi nie są poprawne. Menu kontekstowe mają własne zdarzenia w DataGridView. Istnieje zdarzenie dla menu kontekstowego wiersza i menu kontekstowego komórki.
Powodem, dla którego te odpowiedzi nie są właściwe, jest to, że nie uwzględniają one różnych schematów działania. Opcje ułatwień dostępu, połączenia zdalne lub portowanie Metro / Mono / Web / WPF mogą nie działać, a skróty klawiaturowe nie działają poprawnie (Shift + F10 lub klawisz Menu kontekstowe).
Wybór komórek prawym przyciskiem myszy musi być obsługiwany ręcznie. Wyświetlanie menu kontekstowego nie musi być obsługiwane, ponieważ obsługuje to interfejs użytkownika.
To całkowicie naśladuje podejście stosowane przez Microsoft Excel. Jeśli komórka należy do wybranego zakresu, zaznaczenie komórek nie zmienia się i nie
CurrentCell
. Jeśli tak nie jest, stary zakres jest czyszczony, a komórka jest zaznaczona i staje sięCurrentCell
.Jeśli nie masz pewności co do tego,
CurrentCell
jest to miejsce, w którym klawiatura ma fokus po naciśnięciu klawiszy strzałek.Selected
jest to, czy jest częściąSelectedCells
. Menu kontekstowe pojawi się po kliknięciu prawym przyciskiem myszy, tak jak jest obsługiwane przez interfejs użytkownika.Skróty klawiaturowe domyślnie nie wyświetlają menu kontekstowego, więc musimy je dodać.
Przeprojektowałem ten kod, aby działał statycznie, więc możesz skopiować i wkleić go do dowolnego wydarzenia.
Kluczem jest użycie,
CellContextMenuStripNeeded
ponieważ da ci to menu kontekstowe.Oto przykład, w
CellContextMenuStripNeeded
którym możesz określić, które menu kontekstowe ma być wyświetlane, jeśli chcesz mieć różne menu w wierszu.W tym kontekście
MultiSelect
jestTrue
iSelectionMode
jestFullRowSelect
. To tylko przykład, a nie ograniczenie.źródło
The CellContextMenuStripNeeded event occurs only when the DataGridView control DataSource property is set or its VirtualMode property is true.
Użyj
CellMouseDown
wydarzenia naDataGridView
. Na podstawie argumentów obsługi zdarzeń można określić, która komórka została kliknięta. Za pomocąPointToClient()
metody w DataGridView można określić względne położenie wskaźnika do DataGridView, dzięki czemu można wyświetlić menu w prawidłowej lokalizacji.(
DataGridViewCellMouseEvent
Parametr podaje tylkoX
iY
względem klikniętej komórki, co nie jest tak łatwe w użyciu, aby wyświetlić menu kontekstowe).To jest kod, którego użyłem, aby uzyskać pozycję myszy, a następnie dostosuj położenie DataGridView:
Cały program obsługi zdarzeń wygląda następująco:
źródło
(sender as DataGridView)[e.ColumnIndex, e.RowIndex];
do prostszego połączenia z komórką.ContextMenuStrip
CellContextMenuStripNeeded
e.ColumnIndex
,e.RowIndex
.Wierzę, że o
e.RowIndex
to właśnie prosisz.Sugestia: gdy użytkownik spowoduje
CellContextMenuStripNeeded
uruchomienie zdarzenia , użyj go,e.RowIndex
aby pobrać dane z sieci, takie jak identyfikator. Zapisz identyfikator jako element tagu zdarzenia menu.Teraz, gdy użytkownik faktycznie kliknie pozycję menu, użyj właściwości Sender, aby pobrać tag. Użyj tagu zawierającego swój identyfikator, aby wykonać wymaganą czynność.
źródło
CellContextMenuStripNeeded
procedury obsługi zdarzeniaif(e.RowIndex >= 0){e.ContextMenuStrip = yourContextMenuInstance;}
oznacza to, że menu jest wyświetlane tylko po kliknięciu prawym przyciskiem myszy prawidłowego wiersza (tj. Nie w nagłówku ani w pustym obszarze siatki)CellContextMenuStripNeeded
pomocnej odpowiedzi: działa tylko wtedy, gdy twój DGV jest powiązany ze źródłem danych lub jeśli jego VirtualMode jest ustawiony na true. W innych przypadkach trzeba będzie ustawić ten tag wCellMouseDown
zdarzeniu. Aby być po bezpiecznej stronie, wykonajDataGridView.HitTestInfo
w programie obsługi zdarzeń MouseDown, aby sprawdzić, czy jesteś w komórce.Po prostu przeciągnij składnik ContextMenu lub ContextMenuStrip do formularza i wizualnie go zaprojektuj, a następnie przypisz go do właściwości ContextMenu lub ContextMenuStrip żądanej kontrolki.
źródło
Wykonaj kroki:
Utwórz menu kontekstowe, takie jak:
Aby wyświetlić to menu, użytkownik musi kliknąć wiersz prawym przyciskiem myszy. Musimy obsłużyć zdarzenie _MouseClick i zdarzenie _CellMouseDown.
selectedBiodataid to zmienna zawierająca wybrane informacje o wierszu.
Oto kod:
a wynikiem będzie:
źródło
Jeśli chodzi o pozycję menu kontekstowego, y znalazłem problem polegający na tym, że potrzebowałem, aby było ono względne w stosunku do DataGridView, a zdarzenie, którego potrzebowałem, daje punktację względem klikniętej komórki. Nie znalazłem lepszego rozwiązania, więc zaimplementowałem tę funkcję w klasie commons, więc dzwonię z dowolnego miejsca.
Jest dość przetestowany i działa dobrze. Mam nadzieję, że uznasz to za przydatne.
źródło