2016-06-22 5 views
4

Я работаю над приложением Windows Forms, и я пришел к тому, что не могу понять, что происходит.Удаление обработчиков событий в C#

У меня есть нечто похожее на архитектуру MVC. Иногда я хочу, чтобы элементы управления, принадлежащие представлению, перестали слушать события. Так внутри кода вида я написал метод, который выглядит следующим образом:

public void enableEventHandlers(bool enable) 
{ 
    if (enable) 
    { 
     control.someEvent += someEventHandler; 
    } 
    else 
    { 
     control.someEvent -= someEventHandler; 
    } 
} 

Дело в том: когда я хочу, чтобы удалить обработчик событий я просто вызвать этот метод с ложным в качестве параметра. Если я вызываю этот метод из кода просмотра, он работает отлично. Но если я вызываю этот метод изнутри кода контроллера, он не работает (обработчики событий не удаляются).

Просто чтобы дать немного больше контекста:

Это работает:

public partial class View : Form 
{ 
    public void enableEventHandlers(bool enable) 
    { 
     // The code I already showed 
    } 

    public void doSomething() 
    { 
     enableEventHandlers(false); 
     // do something 
     enableEventHandlers(true); 
    } 
} 

Это doens't работа:

public class controller 
{ 
    private View myView; 

    public void doSomething() 
    { 
     myView.enableEventHandlers(false); 
     // Do something... but somehow everything inside my Form is still paying attention to events 
     myView.enableEventHandlers(true); 
    } 
} 
+0

Это не проблема нитей? Весь код GUI должен вызываться из основного потока. Является ли ваш контроллер другой нитью? – AnthonyLambert

+3

Поскольку ваш код выглядит так, как будто он должен делать то, что вы хотите, я думаю, нам нужен еще какой-то контекст. Можете ли вы попытаться создать [mcve] (http://stackoverflow.com/help/mcve), чтобы мы могли воспроизвести проблему? –

+0

Кроме того, вы можете проверить, действительно ли обработчик событий зарегистрирован, прежде чем пытаться его удалить. То же самое касается добавления обработчика. Убедитесь, что в настоящий момент не зарегистрирован обработчик. Кроме того, ваша форма является частичным классом. Убедитесь, что код инициализации не регистрирует обработчик событий. Лучше избегать использования конструктора для WinForms dev. Просто создайте класс, который подклассы Form и напишите код самостоятельно. У вас будет намного лучший контроль над конечным продуктом. Вы также должны рассмотреть свой дизайн пользовательского интерфейса. Если вам нужно удалить обработчики, подобные этому, это, вероятно, неправильно. – ManoDestra

ответ

-2

Я не знаю, если это так, но вы Бесполезный Не инициализируйте свой вид. Вы просто говорите «private View view», но это нигде не указывает. Вы хотите либо создать новый View, выполнив private View v = new View(), либо позволить этому представлению точку зрения, которую вы хотите изменить.

+1

Итак, он поймал бы «NullReferenceException», и я уверен, что он рассказал бы об этом. –

0

И наконец, я нашел проблему. Кажется, я каким-то образом дважды привязывал обработчик событий к одному и тому же элементу управления. Я так и не смог найти точный номер строки, где я это делал. Решение, которое я нашел, заключается в удалении обработчика события перед добавлением нового. Так что метод enableEventHandlers теперь выглядит так:

public void enableEventHandlers(bool enable) { 
    if (enable) 
    { 
     control.someEvent -= someEventHandler; 
     control.someEvent += someEventHandler; 
    } 
    else 
    { 
     control.someEvent -= someEventHandler; 
    } 
} 

Спасибо за ваши ответы.

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