【问题标题】:FormClosing event cancel from within another event?FormClosing 事件从另一个事件中取消?
【发布时间】:2015-12-25 10:58:59
【问题描述】:

对于一个学校项目,我被要求创建一个网络浏览器。 在上下文菜单中,我有一个“退出”按钮,它执行一系列操作,例如将数据上传到 SQL 数据库等。如果“尝试”块中有错误,如果用户想要,catch 块会向用户提供一个问题关闭与否。

在“formclosure”事件中,我已经从“exit”按钮连接了我已经存在的“exit”功能,这样如果用户按下红色的“X”(在窗口屏幕上)关闭表单,它将效果一样。

问题在于,因为它是一个“表单关闭”事件,即使用户在“退出”按钮的问题对话框中选择“否”,它也会关闭表单。

所以我的问题是如何从“退出”按钮中取消“表单关闭”请求?

附: 请忽略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);
}

【问题讨论】:

  • 将清理代码移到另一个方法中。
  • 这就是我讨厌winforms的原因! @HansPassant

标签: c# .net winforms events formclosing


【解决方案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();
    }
}

【讨论】:

  • 太棒了!我什至没有想到这个哦这么简单的解决方案,因为使用 This.Close() 函数无论如何都会激活表单关闭!非常感谢!
  • 只是对您的答案的一个小修正 - 不需要“this.Close();”在“try”块中的函数,因为它已经在“formclosure”事件中,因此将导致双重关闭,这会将其跳过到“catch”块。即“try”块中的所有命令都会成功,但无论如何它都会移动到catch块。
猜你喜欢
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2012-04-10
  • 1970-01-01
  • 2017-06-15
相关资源
最近更新 更多