Delete / Kill / Remove UserControl и его обработчики событий - PullRequest
1 голос
/ 08 сентября 2010

Я динамически создаю UserControls, используя Reflection: UserControl myConmtrol = (UserControl) Activator.CreateInstance (t);

UserControl может обрабатывать событие Closing, но я не знаю имени обработчика.

Когда окно, в котором размещается UserControl, закрывается, я удаляю UserControl из его родительского окна, и оно исчезает из окна: все выглядит нормально.

Но если я снова открываю и закрываю UserControl, который я вижу в отладчикесобытие закрытия обрабатывается дважды, один раз текущим UserControl, но также и предыдущим UserControl, который все еще жив.

Теоретически UserControl, на который больше не ссылаются, должен быть GarbageCollected.Как я могу заставить его быть убитым / удаленным / уничтоженным?По крайней мере, есть ли способ запретить ему обрабатывать события?

Спасибо

Ответы [ 3 ]

0 голосов
/ 08 сентября 2010

Мне пришлось столкнуться с той же ситуацией в Winforms, где я динамически создавал пользовательский элемент управления внутри другого пользовательского элемента управления (скажем, «DynControl» внутри «HostControl»).

В «HostControl» нет события закрытия. Поэтому я использовал событие Disposed HostControl для освобождения ресурсов:

this.Disposed += (s, e1) => 
{
  DynControl.Click -= += new EventHandler(MyClickHandler);
  this.Controls.Remove(DynControl);
  DynControl.Dispose();
};
0 голосов
/ 08 сентября 2010

Ответ об удалении обработчиков, не зная их имен:

public void RemoveHandlerOfUserControl(UserControl uc)
{

    MulticastDelegate dlg = MyEvent;
    Delegate[] handlers = dlg.GetInvocationList();
    foreach (Delegate d in handlers)
    {
        if (d.Target == uc)
        {
            this.RemoveHandler(MyEvent, d);
        }
    }
 }

Этот метод должен находиться в объекте, где объявлено событие.

0 голосов
/ 08 сентября 2010

Не уверен, без более подробной информации, но я бы запустил и проверил, есть ли у вас обработчики событий, которые не были удалены

Нужно ли удалять подписки на события из объектов до того, как они станут сиротами?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...