2017-01-27 3 views
0

Я нашел хороший пример того, как удалить все CLICK события из формы:Как удалить событие закрытия?

private void RemoveClickEvent(Form c) 
{ 
    var f1 = typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic); 
    var obj = f1.GetValue(c); 
    var pi = c.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance); 
    var list = (EventHandlerList)pi.GetValue(c, null); 
    list.RemoveHandler(obj, list[obj]); 
} 

и он хорошо работает. Тем не менее, мне нужно удалить событие закрытия, но я не знаю, что писать, а не EventClick, чтобы заставить его работать. Я попытался написать EventClosing, Closing, но это не сработало. Таким образом, мой вопрос: Что нужно изменить, чтобы заставить его работать? Еще лучше - я хотел бы найти список всех возможных входов там, так как я, возможно, потребуется удалить другие события, как Closed, FormClosing, FormClosed и т.д.

P.S. простой -= невозможен, так как может быть много событий, связанных со многими из них, которые мне недоступны, поэтому я не смог бы их удалить.

+0

Вы хотите, чтобы форма силы не закрывалась? –

+0

Нет, на самом деле все наоборот: я хочу закрыть его без каких-либо событий, кроме стандартных закрытий. Например: я хочу, чтобы форма не показывала MessageBox с запросом «Есть несохраненные изменения. Вы уверены, что хотите закрыть?». –

+0

Итак, когда вы нажимаете или пытаетесь закрыть форму, она показывает messageBox с вопросом? Я не мог полностью понять вашу проблему, но не могу удалить коды, отображающие сообщение? –

ответ

0

Как уже упоминалось в комментариях я пришел со списком этих имен событий с этим:

typeof(Form).GetFields(BindingFlags.NonPublic | BindingFlags.Static).AsEnumerable().ToList(); 

Теперь у меня есть метод, который выглядит следующим образом:

public static class Utils 
{ 
    public static void DisableEvents<T>(this T ctrl, string officialName, string simplifiedName) where T : Control 
    { 
     var propertyInfo = ctrl.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); 
     var eventHandlerList = propertyInfo.GetValue(ctrl, new object[] { }) as EventHandlerList; 
     var fieldInfo = typeof(T).GetField(officialName, BindingFlags.NonPublic | BindingFlags.Static); 
     var eventKey = fieldInfo.GetValue(ctrl); 
     var eventHandler = eventHandlerList[eventKey]; 
     var invocationList = eventHandler.GetInvocationList(); 

     foreach (var item in invocationList) 
     { 
      ctrl.GetType().GetEvent(simplifiedName).RemoveEventHandler(ctrl, item); 
     } 
    } 
} 

И использование выглядит следующим образом:

myForm.DisableEvents<Form>("EVENT_CLOSING", "Closing"); 

К сожалению, я еще не придумал способ пройти один год примените мой метод.

Смежные вопросы