Как не поднять событие в закрытую форму? - PullRequest
3 голосов
/ 20 апреля 2010

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

Сценарий (см. Ниже код для справки):

  1. Form1 открывает Form2
  2. Form1 подписывается на событие Form2 (назовем событие FormAction)
  3. Form1 закрыт, а Form2 остается открытым
  4. Form2 вызывает FormAction событие

В Form1.form2_FormAction, почему this возвращает ссылку на Form1, а button1.Parent возвращает null? Разве они не должны возвращать одну и ту же ссылку?

Если мы пропустим шаг 3, и this, и button1.Parent вернут одну и ту же ссылку.

Вот код, который я использую ...

Form1:

public partial class Form1 : Form
{
    public Form1 ()
    {
        InitializeComponent();
    }

    private void button1_Click ( object sender , EventArgs e )
    {
        // Create instance of Form2 and subscribe to the FormAction event
        var form2 = new Form2();
        form2.FormAction += form2_FormAction;
        form2.Show();
    }

    private void form2_FormAction ( object o )
    {
        // Always returns reference to Form1
        var form = this;

        // If Form1 is open, button1.Parent is equal to form/this
        // If Form1 is closed, button1.Parent is null
        var parent = button1.Parent;
    }
}

Form2:

public partial class Form2 : Form
{
    public Form2 ()
    {
        InitializeComponent();
    }

    public delegate void FormActionHandler ( object o );
    public event FormActionHandler FormAction = delegate { };

    private void button1_Click ( object sender , EventArgs e )
    {
        FormAction( "Button clicked." );
    }
}

В идеале, я бы хотел избежать поднятия событий в закрытые / удаленные формы (что я не уверен, что это возможно) или найти чистый способ обработки этого в вызывающей программе (в данном случае Form1).

Любая помощь приветствуется.

Ответы [ 2 ]

4 голосов
/ 20 апреля 2010

Когда вы закрываете form1, вы должны отписаться от события:

form2.FormAction -= form2_FormAction;
3 голосов
/ 20 апреля 2010

Простым решением было бы показать ваш экземпляр Form2, используя переопределение, которое принимает владельца:

form2.Show(this);

Это будет гарантировать, что form2 закрыта, когда form1 закрыта.Как правило, это хорошая практика в приложениях с несколькими формами, так что у вас нет плавающих форм без владельца.

Обновление: модель событий является лишь одним из способов обработки взаимодействия междуформы.В вашем случае это не совсем подходит, потому что форма, получающая событие, может закрыться, и форма, вызывающая событие, не узнает об этом.

Альтернативой может быть написание Form2 с конструктором, который включает в себя экземпляр Form1 какпараметр (который будет сохранен как элемент уровня формы, например _Receiver или что-то в этом роде).Вместо того, чтобы вызывать событие, Form2 будет вызывать метод, определенный в Form1, после проверки, чтобы узнать, был ли уже удален _Receiver:

if (!_Receiver.IsDisposed)
{
    _Receiver.SomeMethod("some method");
}

Если ваш экземпляр Form1 все еще существует, будет вызван его метод;если он был закрыт и утилизирован, его метод вызываться не будет.Поскольку форма Form2 все еще существует, вы также можете сделать _Receiver публичным свойством и в любое время установить для его «владельца» какой-либо другой объект Form1.

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