Отмена события FormClosing из другого события?

Для школьного проекта меня попросили создать веб-браузер. В контекстном меню у меня есть кнопка «Выход», которая выполняет множество операций, таких как загрузка данных в базу данных SQL и т. Д. Если есть ошибка в блоке «try», блок catch предлагает пользователю вопрос, хочет ли он закрыть или нет.

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

Проблема в том, что поскольку это событие «закрытия формы», оно закрывает форму, даже если пользователь выбрал «нет» в диалоговом окне вопроса с помощью кнопки «Выход».

Итак, мой вопрос: как мне отменить запрос на закрытие формы с помощью кнопки «Выход»?

P.S. Не обращайте внимания на странные вещи вроде команды delete sql, у нашего учителя есть странные запросы. Предположим, что это действительно запрошенная функция.

private void יציאהToolStripMenuItem_Click(object sender, EventArgs e)
{
    Favorite fav;
    SqlCommand delfav = new SqlCommand("DELETE FROM tblFavorites", conn);
    SqlCommand addfav = new SqlCommand("INSERT INTO tblFavorites VALUES (@title, @url)", conn);
    addfav.Parameters.Add("@title", SqlDbType.NVarChar, 100);
    addfav.Parameters.Add("@url", SqlDbType.NVarChar, 300);
    try
    {
        conn.Open();
        delfav.ExecuteNonQuery();
        for (int i=0; i<favorites.Items.Count; i++)
        {
            fav = (Favorite)favorites.Items[i];
            addfav.Parameters["@title"].Value = fav.getsettitle;
            addfav.Parameters["@url"].Value = fav.getseturl;
            addfav.ExecuteNonQuery();
        }
        Application.Exit();
    }
    catch
    {
        DialogResult dialogResult = MessageBox.Show("There was a problem loading your favorites to the database. Do you still wish to quit? \n (All changes to the favorites list will be lost)", "", MessageBoxButtons.YesNo);
        if (dialogResult == DialogResult.Yes)
        {
            Application.Exit();
        }
        else
        {
            //Cancel the formclosing event here!
        }
    }
    finally
    {
        conn.Close();
    }
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    יציאהToolStripMenuItem_Click(null, null);
}

person Nimrod Yanai    schedule 25.12.2015    source источник
comment
Переместите код очистки в другой метод.   -  person Hans Passant    schedule 25.12.2015
comment
Вот почему я ненавижу winforms! @HansPassant   -  person Hamid Pourjam    schedule 25.12.2015


Ответы (1)


Вам следует заменить функции этих двух обработчиков событий. Также вы должны использовать this.Close() вместо Application.Exit()

private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
    this.Close();
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    // your code
    try
    {
        // your code
    }
    catch
    {
        DialogResult dialogResult = MessageBox.Show("There was a problem loading your favorites to the database. Do you still wish to quit? \n (All changes to the favorites list will be lost)", "", MessageBoxButtons.YesNo);
        if (dialogResult != DialogResult.Yes)
        {
            //Cancel the formclosing event here!
            e.Cancel = true;
        }
    }
    finally
    {
        conn.Close();
    }
}
person Hamid Pourjam    schedule 25.12.2015
comment
Это великолепно! Я даже не думал об этом, о таком простом решении, поскольку использование функции This.Close () все равно активирует закрытие формы! Большое спасибо! - person Nimrod Yanai; 25.12.2015
comment
Небольшая поправка к вашему ответу - в this.Close () нет необходимости; в блоке try, так как он уже находится в событии закрытия формы, и это приведет к двойному закрытию, которое пропустит его в блок catch. то есть все команды в блоке try БУДУТ успешными, но в любом случае он переместится в блок catch. - person Nimrod Yanai; 25.12.2015