Saya memiliki datagridview dalam aplikasi winform NET. Saya ingin mengklik kanan pada baris dan menampilkan menu. Kemudian saya ingin memilih hal-hal seperti salin, validasi, dll
Bagaimana cara membuat A) menu pop up B) menemukan baris mana yang diklik kanan. Saya tahu saya bisa menggunakan selectedIndex tetapi saya harus bisa mengklik kanan tanpa mengubah apa yang dipilih? sekarang saya dapat menggunakan indeks yang dipilih tetapi jika ada cara untuk mendapatkan data tanpa mengubah apa yang dipilih maka itu akan berguna.
sumber
m.Show(dataGridView1.PointToScreen(e.Location));
Meskipun pertanyaan ini sudah tua, jawabannya tidak tepat. Menu konteks memiliki acara mereka sendiri di DataGridView. Ada acara untuk menu konteks baris dan menu konteks sel.
Alasan mengapa jawaban ini tidak tepat adalah karena tidak memperhitungkan skema operasi yang berbeda. Opsi aksesibilitas, koneksi jarak jauh, atau port Metro / Mono / Web / WPF mungkin tidak berfungsi dan pintasan keyboard turun ke kanan gagal (tombol Shift + F10 atau Menu Konteks).
Pemilihan sel pada klik kanan mouse harus ditangani secara manual. Menampilkan menu konteks tidak perlu ditangani karena ini ditangani oleh UI.
Ini sepenuhnya meniru pendekatan yang digunakan oleh Microsoft Excel. Jika sel adalah bagian dari rentang yang dipilih, pemilihan sel tidak berubah dan tidak juga
CurrentCell
. Jika tidak, rentang lama dihapus dan sel dipilih dan menjadiCurrentCell
.Jika Anda tidak jelas tentang ini, di
CurrentCell
mana keyboard memiliki fokus saat Anda menekan tombol panah.Selected
adalah apakah itu bagian dariSelectedCells
. Menu konteks akan ditampilkan pada klik kanan seperti yang ditangani oleh UI.Pintasan keyboard tidak menampilkan menu konteks secara default, jadi kita harus menambahkannya.
Saya telah mengerjakan ulang kode ini agar berfungsi secara statis, sehingga Anda dapat menyalin dan menempelkannya ke acara apa pun.
Kuncinya adalah menggunakan
CellContextMenuStripNeeded
karena ini akan memberi Anda menu konteks.Berikut adalah contoh penggunaan di
CellContextMenuStripNeeded
mana Anda dapat menentukan menu konteks mana yang akan ditampilkan jika Anda ingin memiliki menu yang berbeda per baris.Dalam konteks ini
MultiSelect
adalahTrue
danSelectionMode
adalahFullRowSelect
. Ini hanya untuk contoh dan bukan batasan.sumber
The CellContextMenuStripNeeded event occurs only when the DataGridView control DataSource property is set or its VirtualMode property is true.
Gunakan
CellMouseDown
acara diDataGridView
. Dari argumen penanganan peristiwa, Anda dapat menentukan sel mana yang diklik. Dengan menggunakanPointToClient()
metode pada DataGridView, Anda dapat menentukan posisi relatif penunjuk ke DataGridView, sehingga Anda dapat memunculkan menu di lokasi yang benar.(
DataGridViewCellMouseEvent
Parameter hanya memberi AndaX
danY
relatif terhadap sel yang Anda klik, yang tidak mudah digunakan untuk memunculkan menu konteks.)Ini adalah kode yang saya gunakan untuk mendapatkan posisi mouse, lalu sesuaikan dengan posisi DataGridView:
Seluruh penangan acara terlihat seperti ini:
sumber
(sender as DataGridView)[e.ColumnIndex, e.RowIndex];
untuk panggilan sederhana ke sel.ContextMenuStrip
CellContextMenuStripNeeded
e.ColumnIndex
,e.RowIndex
.Saya percaya itulah
e.RowIndex
yang Anda minta.Saran: ketika pengguna menyebabkan acara Anda
CellContextMenuStripNeeded
diaktifkan, gunakane.RowIndex
untuk mendapatkan data dari grid Anda, seperti ID. Simpan ID sebagai item tag acara menu.Sekarang, ketika pengguna benar-benar mengklik item menu Anda, gunakan properti Sender untuk mengambil tag. Gunakan tag, yang berisi ID Anda, untuk melakukan tindakan yang Anda butuhkan.
sumber
CellContextMenuStripNeeded
event handler lakukanif(e.RowIndex >= 0){e.ContextMenuStrip = yourContextMenuInstance;}
Ini berarti menu hanya ditampilkan saat mengklik kanan baris yang valid, (yaitu tidak pada heading atau area grid kosong)CellContextMenuStripNeeded
hanya berfungsi jika DGV Anda terikat ke sumber data atau jika VirtualMode-nya disetel ke true. Dalam kasus lain, Anda perlu menyetel tag itu dalamCellMouseDown
acara tersebut. Untuk amannya, lakukanDataGridView.HitTestInfo
di event handler MouseDown untuk memastikan Anda berada di sel.Cukup seret komponen ContextMenu atau ContextMenuStrip ke dalam formulir Anda dan rancang secara visual, lalu tetapkan ke properti ContextMenu atau ContextMenuStrip dari kontrol yang Anda inginkan.
sumber
Ikuti langkah-langkahnya:
Buat menu konteks seperti:
Pengguna perlu mengklik kanan pada baris untuk mendapatkan menu ini. Kita perlu menangani event _MouseClick dan event _CellMouseDown.
selectedBiodataid adalah variabel yang berisi informasi baris yang dipilih.
Ini kodenya:
dan hasilnya adalah:
sumber
Untuk posisi menu konteks, y menemukan masalah yang saya perlukan agar relatif terhadap DataGridView, dan acara yang perlu saya gunakan memberikan poistion relatif terhadap sel yang diklik. Saya belum menemukan solusi yang lebih baik jadi saya mengimplementasikan fungsi ini di kelas commons, jadi saya menyebutnya dari mana pun saya butuhkan.
Ini cukup teruji dan bekerja dengan baik. Semoga bermanfaat.
sumber