Удалить форму после закрытия

У меня возникла новая проблема с открытием и закрытием формы в C #.

Моя проблема в том, как удалить форму после закрытия.

вот мой код:

Program .cs: ​​

static class Program
{
    public static Timer timer;

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        timer = new Timer { Interval = 1000};
        timer.Start();

        Application.Run(new Form1());
    }
}

Form1.cs:

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

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 form = new Form2();
        form.ShowDialog();
       /// I've tried Dispose() method . but didn't work
    }
}

Form2.cs:

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

    private void Form2_Load(object sender, EventArgs e)
    {
        Program.timer.Tick += timer_Tick;    
        Close();
        // I've tried Dispose() method instead of Close() but didn't work
    }

    private int count = 0; 
    void timer_Tick(object sender, EventArgs e)
    {
        count++;
        if (count == 5) MessageBox.Show("");
    }
}

Отредактировано: Мой вопрос: почему окно сообщения отображается через 5 секунд после закрытия form2!

13
задан Mironline 3 November 2013 в 10:33
поделиться

2 ответа

Изменить: этот вопрос касается Dispose.

Во-первых, Dispose никак не связан со сборкой мусора. Происходит следующее:

  1. У вас есть глобальный экземпляр Timer
  2. Вы создаете form2
  3. Form2 подписывается на таймер
  4. Form2 закрывается и/или удаляется
  5. Событие Timer срабатывает, увеличивает счетчик и показывает a MessageBox
  6. Событие Timer продолжает срабатывать, пока приложение не закроется.

Главное, что нужно понять, это то, что Close/Dispose только изменяет статус формы, они не (не могут) «удалить» экземпляр. Таким образом, (закрытая) форма существует, поле счетчика все еще существует, и событие срабатывает.


Хорошо, часть 1:

Блок using () {} был бы лучше, но это должно работать:

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 form = new Form2();
        form.ShowDialog();
       /// I've tried Dispose() method . but didn't work
        form.Dispose(); // should work
    }

Если нет, опишите «не работает».


    private void Form2_Load(object sender, EventArgs e)
    {
        Program.timer.Tick += timer_Tick;    
        Close();
       /// I've tried Dispose() method instead of Close() . but didn't work
    }

Это странно, но я предполагаю, что это искусственный код для вопроса.

Ваш глобальный Program.Timer теперь хранит ссылку на ваш экземпляр Form2 и предотвращает его сбор. Это не мешает ему быть удаленным/закрытым, поэтому ваш таймер будет продолжать срабатывать для закрытой формы, и это обычно не работает и вызывает другие проблемы.

  1. Не делайте этого (дайте Form2 собственный таймер)
  2. Используйте событие FormClosed для отмены подписки: Program.timer.Tick -= timer_Tick;
9
ответ дан 1 December 2019 в 23:46
поделиться

form.ShowDialog() показывает форму как модальное диалоговое окно. Это означает, что вызов не возвращается до тех пор, пока форма не будет закрыта.
Обратите внимание, что щелчок по X в модальном диалоговом окне не закрывает форму, а просто скрывает ее. Я предполагаю, что это то, что смущает вас. Если вы хотите, чтобы код в form1 продолжал выполняться, а не блокировался, вам следует вызвать Show() вместо ShowDialog(). Немодальный режим закроется при нажатии X.

Если вам нужен блокирующий модальный диалог, вы должны окружить форму блоком использования, как описано в других ответах.
При создании модального диалога вы обычно добавляете кнопку «ОК» или аналогичную и устанавливаете свойство AcceptButton формы для этой кнопки, чтобы пользователь мог закрыть форму, нажав клавишу ввода. Точно так же вы можете добавить кнопку «Отмена» и установить свойство CancelButton для захвата клавиши Esc.
Добавьте обработчик кликов к двум кнопкам, соответствующим образом установите свойство DialogResult формы и вызовите Close().

0
ответ дан 1 December 2019 в 23:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: