Como faço para cancelar o registro de todos os manipuladores para um evento de formulário?

StackOverflow https://stackoverflow.com/questions/287663

  •  08-07-2019
  •  | 
  •  

Pergunta

Eu tenho 2 manipuladores usando o mesmo formulário. Como faço para remover os manipuladores antes de adicionar o novo (C #)?

Foi útil?

Solução

Se você estiver trabalhando no próprio formulário, você deve ser capaz de fazer algo como:

Pseudocódigo:

Delegate[] events = Form1.SomeEvent.GetInvokationList();

foreach (Delegate d in events)
{
     Form1.SomeEvent -= d;
}

Do lado de fora da forma, o seu SOL.

Outras dicas

Se você sabe o que esses manipuladores são, apenas retirá-los da mesma forma que você se inscreveu para eles, exceto com - = em vez de + =

.

Se você não sabe o que os manipuladores são, você não pode removê-los -. A idéia é que o encapsulamento evita eventos Uma parte interessada de sobrepor os interesses de outra classe em observar um evento

EDIT: Eu estive assumindo que você está falando de um evento implementado por uma classe diferente, por exemplo, um controlo. Se sua classe é o "dono" do evento, em seguida, basta definir a variável relevante para null.

Eu percebo esta pergunta é bastante antiga, mas espero que ajude alguém. Você pode cancelar o registro de todos os manipuladores de eventos para qualquer classe com um pouco de reflexão.

public static void UnregisterAllEvents(object objectWithEvents)
{
    Type theType = objectWithEvents.GetType();

    //Even though the events are public, the FieldInfo associated with them is private
    foreach (System.Reflection.FieldInfo field in theType.GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance))
    {
        //eventInfo will be null if this is a normal field and not an event.
        System.Reflection.EventInfo eventInfo = theType.GetEvent(field.Name);
        if (eventInfo != null)
        {
            MulticastDelegate multicastDelegate = field.GetValue(objectWithEvents) as MulticastDelegate;
            if (multicastDelegate != null)
            {
                foreach (Delegate _delegate in multicastDelegate.GetInvocationList())
                {
                    eventInfo.RemoveEventHandler(objectWithEvents, _delegate);
                }
            }
        }
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top