从某些事件中取消窗体关闭

4

如果在我的SaveAs点击事件中,SaveFileDialogCancel取消,我希望我的formClosing事件可以cancel它的关闭操作。

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

void form1_FormClosing (object sender, FormClosingEventArgs e) 
{
    if (isContentChanged) 
    {
        DialogResult result = MessageBox.Show ("Do you want to save [ "+this.Text+"] ?", "Save", MessageBoxButtons.YesNoCancel);
        if (result == DialogResult.Yes) 
        {
            saveAsToolStripMenuItem_Click (sender, e);
        } 
        else if (result == DialogResult.Cancel) 
            e.Cancel = true;
    }
}


private void saveAsToolStripMenuItem_Click (object sender, EventArgs e) 
{
    SaveFileDialog sfd = new SaveFileDialog ();
    sfd.Filter = "Drawing Files | *.drg";
    DialogResult result = sfd.ShowDialog ();
    if (result == DialogResult.OK) {
        SaveFile (sfd.FileName);
        isContentChanged = false;
    } 
    else if (result == DialogResult.Cancel) 
    {
        // NEED TO CANCEL FORM CLOSING HERE   
    }
}

这是否可能?如果是,如何实现?


你可以使用 return; 来取消事件。 - Fᴀʀʜᴀɴ Aɴᴀᴍ
@FarhanAnam 表单将被关闭,因为我在 formclosing 事件中没有取消(e.Cancel = true)表单的关闭。在此事件处理程序中取消它是否可能? - Naveen Kumar V
1个回答

3

试试这个:

private void saveAsToolStripMenuItem_Click (object sender, EventArgs e) 
{
   ...

   if (result == DialogResult.OK) 
   {
       ...         
   } 
   else if (result == DialogResult.Cancel) 
   {  
       ((FormClosingEventArgs) e).Cancel = true; 
   }
}

它起作用了 :) 。但是我不明白这里发生了什么。你能再解释一下吗? - Naveen Kumar V
1
@NaveenKumarV...在按钮单击事件中,您不能将e.Cancel设置为true,因此您应该将e强制转换为FormClosingEventArgs,以便您可以访问Cancel属性。 - Salah Akbari
1
@NaveenKumarV...加上我的前一个评论:FormClosingEventArgs是从CancelEventArgs派生而来,而它又是从EventArgs派生而来的。 - Salah Akbari
1
当你从 form1_Closing 调用 saveAsToolStripMenuItem_Click 时,你正在传递相同的 FormClosingEventArgs 作为参数。方法 saveAsToolStripMenuItem_Click 将其伪装成 EventArgs 接收(有关更多信息,请参见多态性)。问题是类型 EventArgs 没有属性 Cancel,所以它对你没有任何用处。将其向下转换为 FormClosingEventArgs 就可以解决问题了。 - Matias Cicero
1
请注意,如果参数“e”不是伪装的“FormClosingEventArgs”,上述代码将抛出转换异常。 - Matias Cicero
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接