Untuk membuat pengendali acara baru pada kontrol Anda bisa melakukan ini
c.Click += new EventHandler(mainFormButton_Click);
atau ini
c.Click += mainFormButton_Click;
dan untuk menghapus event handler Anda dapat melakukan ini
c.Click -= mainFormButton_Click;
Tetapi bagaimana Anda menghapus semua penangan acara dari suatu acara?
c.Click = null
?Clear
metode sederhana ternyata terlalu banyak usahaJawaban:
Saya menemukan solusi di forum MSDN . Kode sampel di bawah ini akan menghapus semua
Click
acarabutton1
.sumber
RemoveClickEvent
dimulai denganFieldInfo f1 = typeof(Button)
:? Saya mendapat nullGetField
jika saya gunakanControl
.ObservableCollection.CollectionChanged += null;
Kalian membuat WAY ini terlalu keras untuk dirimu sendiri. Ini semudah ini:
sumber
FindClicked = null;
yang lebih sederhana.kinect.ColorFrameReady -= MyEventHander
tidak, tetapi tidak adaGetInvocationList()
metode pada instance kinect untuk beralih pada delegasi mereka.GetInvocationList
tidak ditemukan.Dari Menghapus Semua Penangan Acara :
sumber
Jawaban yang diterima tidak penuh. Ini tidak berfungsi untuk acara yang dinyatakan sebagai {add; menghapus;}
Ini kode kerjanya:
sumber
BindingFlags.Public
pertamaGetField
.Tidak ada salahnya untuk menghapus event handler yang tidak ada. Jadi, jika Anda tahu penangan apa yang ada, Anda bisa menghapus semuanya. Saya hanya punya kasus serupa. Ini dapat membantu dalam beberapa kasus.
Suka:
sumber
Saya sebenarnya menggunakan metode ini dan itu bekerja dengan sempurna. Saya 'terinspirasi' oleh kode yang ditulis oleh Aeonhack di sini .
Bidang MyEventEvent disembunyikan, tetapi memang ada.
Debugging, Anda dapat melihat bagaimana
d.target
objek sebenarnya menangani acara, dand.method
metodenya. Anda hanya perlu menghapusnya.Ini bekerja dengan baik. Tidak ada lagi objek yang tidak GC karena penangan acara.
sumber
Saya benci solusi lengkap yang ditampilkan di sini, saya melakukan campuran dan diuji sekarang, bekerja untuk pengendali acara:
Mudah! Terima kasih untuk Stephen Punak.
Saya menggunakannya karena saya menggunakan metode lokal umum untuk menghapus delegasi dan metode lokal dipanggil setelah kasus yang berbeda, ketika delegasi yang berbeda diselesaikan.
sumber
Jika Anda benar -benar harus melakukan ini ... itu akan membutuhkan refleksi dan cukup waktu untuk melakukan ini. Penangan event dikelola dalam event-to-delegate-map di dalam kontrol. Anda harus melakukannya
Singkatnya, banyak pekerjaan. Mungkin saja secara teori ... Saya tidak pernah mencoba hal seperti ini.
Lihat apakah Anda dapat memiliki kontrol / disiplin yang lebih baik atas fase berlangganan-berhenti berlangganan untuk kontrol.
sumber
Stephen benar. Ini sangat mudah:
sumber
foreach (EventHandler<MyCompletedArgs> handler in CompletionCompleted.GetInvocationList())
{
CompletionCompleted -= handler;
}
Saya baru saja menemukan Cara menunda acara saat mengatur properti dari kontrol WinForms . Ini akan menghapus semua acara dari kontrol:
sumber
Wow. Saya menemukan solusi ini, tetapi tidak ada yang berhasil seperti yang saya inginkan. Tapi ini sangat bagus:
sumber
Halaman ini banyak membantu saya. Kode yang saya dapatkan dari sini dimaksudkan untuk menghapus acara klik dari sebuah tombol. Saya perlu menghapus acara klik ganda dari beberapa panel dan klik acara dari beberapa tombol. Jadi saya membuat ekstensi kontrol, yang akan menghapus semua penangan acara untuk acara tertentu.
Sekarang, penggunaan extenstion ini. Jika Anda perlu menghapus acara klik dari sebuah tombol,
Jika Anda perlu menghapus acara klik dua kali dari panel,
Saya bukan ahli C #, jadi jika ada bug tolong maafkan saya dan beri tahu saya tentang itu.
sumber
Terkadang kita harus bekerja dengan kontrol ThirdParty dan kita perlu membangun solusi yang canggung ini. Berbasis di @Anoop Muraleedharan jawaban saya membuat solusi ini dengan tipe inferensi dan dukungan ToolStripItem
Dan Anda bisa menggunakannya seperti ini
sumber
Saya menemukan solusi kerja lain oleh Douglas .
Metode ini menghapus semua penangan acara yang ditetapkan pada acara router tertentu pada suatu elemen.
Gunakan seperti
Kode lengkap:
sumber
menghapus semua penangan untuk tombol: save.RemoveEvents ();
sumber
Nah, di sini ada solusi lain untuk menghapus acara yang terkait (jika Anda sudah memiliki metode untuk menangani acara untuk kontrol):
sumber
Ini bukan jawaban untuk OP, tapi saya pikir saya akan memposting ini di sini kalau-kalau itu bisa membantu orang lain.
sumber
Saya menemukan jawaban ini dan hampir sesuai dengan kebutuhan saya. Terima kasih kepada SwDevMan81 untuk kelasnya. Saya telah memodifikasinya untuk memungkinkan penindasan dan melanjutkan metode individual, dan saya pikir saya akan mempostingnya di sini.
sumber