Утилизация формы из родительской формы в C #? - PullRequest
4 голосов
/ 06 апреля 2009

У меня есть форма, которая откроет новую форму при нажатии одной кнопки (form1button). И на дочерней форме будет еще одна кнопка «form2button». Теперь, если я нажму эту кнопку form2, новая форма2 должна быть удалена. Но поскольку объект form2 создан здесь в методе класса form1, я не могу разместить этот объект в методе класса form2 (fom2buttonclick). Поэтому я использовал static для выполнения своей работы, как показано в следующем коде psuedo.

Form1:

class Form1 : Form
{
    static Form2 f2;

    public void Form1_buttonclick(object sender, EventArgs e)
    {
        f2 = new Form2();
    }

    public void Disposef2()
    {
        f2.Dispose();
    }
}

Form2:

class Form2 : Form
{
    public void Form2_buttonclick(object sender, EventArgs e)
    {
        Form1 f1 = new Form1();
        f1.Disposef2();
    }
}

Есть ли другой лучший способ сделать это? Или сама конструкция C # не предоставляет альтернативного механизма. Я новичок в C #. Пожалуйста, помогите мне ..

Редактировать

Я хочу закрыть (явным образом распоряжаться) объект form2, который создается в классе form1 при нажатии кнопки в form2. Это изменение для большей ясности.

Ответы [ 5 ]

7 голосов
/ 06 апреля 2009

MSDN документы по утилизации форм:

Dispose будет вызываться автоматически если форма показывается с помощью Показать метод. Если другой метод, такой как ShowDialog используется, или форма никогда не показывается, вы должны позвонить Располагайте себя внутри своего применение.

Источник

При закрытии и утилизации:

Когда форма закрыта, все ресурсы созданные внутри объекта закрыты и форма утилизируется. Вы можете предотвратить закрытие формы при запуске время обработки события закрытия и установка свойства Отмена CancelEventArgs передается в качестве параметра к вашему обработчику событий. Если форма вам закрываются это форма запуска ваше приложение, ваше приложение заканчивается.

Два условия, когда форма не расположен на Close, когда (1) это часть интерфейса с несколькими документами (MDI) приложение, а форма не видимый; и (2) вы отобразили форма с использованием ShowDialog. В этих случаях вам нужно будет позвонить в Dispose вручную, чтобы отметить все формы элементы управления для сбора мусора.

3 голосов
/ 06 апреля 2009

Если две формы не имеют отношения родительского диалога, вы можете просто подключиться к событию Disposed в подчиненной форме, чтобы получать уведомления при ее закрытии.

public partial class Form1 : Form
{
    private Form2 _Form2;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (_Form2 != null)
            _Form2.Dispose();

        _Form2 = new Form2();
        _Form2.Disposed += delegate
        {
            _Form2.Dispose();
            _Form2 = null;
        };
        _Form2.Show();
    }
}

Тогда все, что вам нужно сделать в Form2, это просто закрыть его:

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

    private void button1_Click(object sender, EventArgs e)
    {
        Close();
    }
}
1 голос
/ 06 апреля 2009

Вы действительно не читатель, верно? Здесь уже много ответов.

Изменить Я хочу закрыть (избавиться явно) объект form2, который является создается в классе form1 при нажатии кнопки Форма2 нажата. Это редактирование, чтобы дать немного больше ясности.

Если вы используете ShowDialog, то form2 возвращается при вызове close (). Итак, в Form1:

private void button1_Click(object sender, System.EventArgs e)
{
    Form2 oForm2 = new Form2();
    oForm2.MyParentForm = this;
    if (oForm2.ShowDialog() == DialogResult.OK)
    {
        oForm2.Dispose(); //or oForm2.Close() what you want
    }
}

И затем вызвать Close () в форме 2.

1 голос
/ 06 апреля 2009
  1. Вам не нужно явно вызывать Dispose в форме, сборщик мусора сделает это за вас.

  2. Если вы хотите, чтобы что-то конкретное происходило, когда Form2 «уходит», вы можете подключиться к событию закрытия формы.

РЕДАКТИРОВАТЬ:

В Form2, при нажатии кнопки, попробуйте

this->Close();

Это закроет тот экземпляр form2 (форма исчезнет). Если у form1 по-прежнему есть ссылка на form2, сборщик мусора не получит form2 и GC не удалит ее.

Если для формы1 есть причина сохранять ссылку на форму2?

Если это так, form1 должен обрабатывать закрывающее событие from2, тогда form1 может освободить его ссылку на form2 (установить в ноль).

Теперь GC выберет form2 в качестве кандидата для сбора, он (возможно, более чем за один шаг) вызовет метод Dispose и освободит память Form2.

0 голосов
/ 31 января 2011

Я сделал это один раз для своего проекта, чтобы закрыть одно приложение и открыть другое приложение.

    System.Threading.Thread newThread;
    Form1 frmNewForm = new Form1;

   newThread = new System.Threading.Thread(new System.Threading.ThreadStart(frmNewFormThread));
this.Close();
        newThread.SetApartmentState(System.Threading.ApartmentState.STA);
        newThread.Start();

И добавьте следующий метод. Ваш newThread.Start будет вызывать этот метод.

    public void frmNewFormThread)()
    {

        Application.Run(frmNewForm);

    }
...