Para criar um novo manipulador de eventos em um controle, você pode fazer isso
c.Click += new EventHandler(mainFormButton_Click);
ou isto
c.Click += mainFormButton_Click;
e para remover um manipulador de eventos, você pode fazer isso
c.Click -= mainFormButton_Click;
Mas como você remove todos os manipuladores de eventos de um evento?
c.Click = null
?Clear
método simples , aparentemente, era muito esforçoRespostas:
Encontrei uma solução nos fóruns do MSDN . O código de exemplo abaixo removerá todos os
Click
eventos debutton1
.fonte
RemoveClickEvent
partida não deve começar comFieldInfo f1 = typeof(Button)
:? Eu fico nuloGetField
se eu usarControl
.ObservableCollection.CollectionChanged += null;
Vocês estão dificultando muito esse caminho. É fácil assim:
fonte
FindClicked = null;
que é bastante mais simples.kinect.ColorFrameReady -= MyEventHander
funciona, mas não háGetInvocationList()
método nas instâncias do kinect para iterar sobre seus delegados.GetInvocationList
não encontrado.De remover todos os manipuladores de eventos :
fonte
A resposta aceita não está completa. Não funciona para eventos declarados como {add; retirar;}
Aqui está o código de trabalho:
fonte
BindingFlags.Public
na primeiraGetField
chamada.Não faz mal excluir um manipulador de eventos inexistente. Portanto, se você souber quais manipuladores podem existir, basta excluir todos eles. Eu apenas tive um caso semelhante. Isso pode ajudar em alguns casos.
Gostar:
fonte
Na verdade, estou usando esse método e funciona perfeitamente. Fui 'inspirado' pelo código escrito por Aeonhack aqui .
O campo MyEventEvent está oculto, mas existe.
Depurando, você pode ver como
d.target
o objeto está realmente lidando com o evento ed.method
seu método. Você só precisa removê-lo.Isso funciona muito bem. Não há mais objetos que não estão sendo colocados em GC por causa dos manipuladores de eventos.
fonte
Eu odiava qualquer solução completa mostrada aqui, fiz um mix e testei agora, trabalhei para qualquer manipulador de eventos:
Fácil! Obrigado por Stephen Punak.
Eu usei porque usei um método local genérico para remover os delegados e o método local foi chamado após casos diferentes, quando delegados diferentes são definidos.
fonte
Se você realmente precisa fazer isso ... vai levar reflexão e algum tempo para fazer isso. Manipuladores de eventos são gerenciados em um mapa de delegação de eventos dentro de um controle. Você precisaria
Em suma, muito trabalho. É possível em teoria ... Eu nunca tentei algo assim.
Veja se você pode ter um melhor controle / disciplina sobre a fase de inscrição / cancelamento da inscrição para o controle.
fonte
Stephen tem razão. Isso é muito fácil:
fonte
foreach (EventHandler<MyCompletedArgs> handler in CompletionCompleted.GetInvocationList())
{
CompletionCompleted -= handler;
}
Acabei de encontrar Como suspender eventos ao definir uma propriedade de um controle WinForms . Ele removerá todos os eventos de um controle:
fonte
Uau. Encontrei esta solução, mas nada funcionou como eu queria. Mas isso é tão bom:
fonte
Esta página me ajudou muito. O código que obtive daqui foi destinado a remover um evento de clique de um botão. Preciso remover eventos de clique duplo de alguns painéis e eventos de clique de alguns botões. Então, eu fiz uma extensão de controle, que removerá todos os manipuladores de eventos para um determinado evento.
Agora, o uso dessa extensão. Se você precisar remover os eventos de clique de um botão,
Se você precisar remover os eventos de clique duplo em um painel,
Eu não sou especialista em C #, por isso, se houver algum erro, por favor me perdoe e por favor me avise.
fonte
Às vezes, temos que trabalhar com controles de terceiros e precisamos criar essas soluções estranhas. Baseado na resposta do @Anoop Muraleedharan, criei esta solução com o tipo de inferência e o suporte ToolStripItem
E você pode usá-lo assim
fonte
Encontrei outra solução de trabalho de Douglas .
Este método remove todos os manipuladores de eventos definidos em um evento de roteta específico em um elemento.
Use-o como
Código completo:
fonte
remove todos os manipuladores do botão: save.RemoveEvents ();
fonte
Bem, aqui está outra solução para remover um evento associado (se você já possui um método para manipular os eventos para o controle):
fonte
Esta não é uma resposta para o OP, mas pensei em publicá-la aqui, caso possa ajudar outras pessoas.
fonte
Encontrei esta resposta e ela quase atendeu às minhas necessidades. Obrigado a SwDevMan81 pela classe. Eu o modifiquei para permitir a supressão e a retomada de métodos individuais, e pensei em publicá-lo aqui.
fonte