У меня возникла новая проблема с открытием и закрытием формы в 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!
Изменить: этот вопрос касается Dispose.
Во-первых, Dispose никак не связан со сборкой мусора. Происходит следующее:
Главное, что нужно понять, это то, что 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 и предотвращает его сбор. Это не мешает ему быть удаленным/закрытым, поэтому ваш таймер будет продолжать срабатывать для закрытой формы, и это обычно не работает и вызывает другие проблемы.
Program.timer.Tick -= timer_Tick;
form.ShowDialog() показывает форму как модальное диалоговое окно. Это означает, что вызов не возвращается до тех пор, пока форма не будет закрыта.
Обратите внимание, что щелчок по X в модальном диалоговом окне не закрывает форму, а просто скрывает ее. Я предполагаю, что это то, что смущает вас.
Если вы хотите, чтобы код в form1 продолжал выполняться, а не блокировался, вам следует вызвать Show() вместо ShowDialog(). Немодальный режим закроется при нажатии X.
Если вам нужен блокирующий модальный диалог, вы должны окружить форму блоком использования, как описано в других ответах.
При создании модального диалога вы обычно добавляете кнопку «ОК» или аналогичную и устанавливаете свойство AcceptButton формы для этой кнопки, чтобы пользователь мог закрыть форму, нажав клавишу ввода. Точно так же вы можете добавить кнопку «Отмена» и установить свойство CancelButton для захвата клавиши Esc.
Добавьте обработчик кликов к двум кнопкам, соответствующим образом установите свойство DialogResult формы и вызовите Close().