2015-09-04 62 views
0

我有一个WinForms应用程序,用于在用户点击取消按钮时检查未决更改。如果有待更改,我会提示用户看看他们是否确定要取消。如果他们这样做,我关闭表格。如果没有,我只是回来。但是,表单正在关闭。经过一些调试后,我意识到这是因为这个特定的按钮被设置为表单的CancelButton,所以点击它会导致表单关闭。为了验证,我删除了CancelButton属性,但行为依然存在。按钮正在自动关闭WindowsForm

我该如何防止这种自动关闭?这里是我的事件处理程序代码:

private void closeButton_Click(object sender, EventArgs e) 
{ 
    DialogResult dr = DialogResult.Yes; 

    if (changesMade) 
    { 
     dr = MessageBoxEx.Show(this, "Are you sure you wish to disregard the changes made?", "Changes Made", MessageBoxButtons.YesNo); 
    } 

    if (dr == DialogResult.Yes) 
    { 
     Close(); 
    } 
    else 
    { 
     //TODO: 
    } 
} 

在上面的代码中,表单只能关闭,如果没有所做的更改,或者如果用户选择忽略他们。我做了更改,并点击了“否”到DialogBox,但表单仍然关闭。有和没有按钮设置为窗体的CancelButton。

+2

我建议在'FormClosing'事件而不是'ButtonClick'中进行检查。然后,相应地设置“e.Cancel”。这样,不管关闭你的表单(无论文件 - >退出,右上角的X按钮等)都会提示未保存的更改。 – sab669

+0

您是否正确调试,使用断点和F10?不良行为的原因应该很容易找到。 –

+0

@TobiasKnauss是的,虽然我没有尝试采用这种方法以外的任何其他方法。 – AdamMc331

回答

1

对我的评论跟进做的投入,这是我的一个内部工具,我最近写做:

private void Form_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    e.Cancel = !PromptUnsavedChanges(); 
} 

private bool PromptUnsavedChanges() 
{ 
    if (HasFormChanged()) //checks if form is different from the DB 
    { 
     DialogResult dr = MessageBox.Show("You have unsaved changes. Would you like to save them?", "Unsaved Changes", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); 

     if (dr == System.Windows.Forms.DialogResult.Yes) 
      tsmiSave_Click(null, null); // Saves the data 
     else if (dr == System.Windows.Forms.DialogResult.Cancel) 
      return false; // Cancel the closure of the form, but don't save either 
    } 

    return true; // Close the form 
} 

逻辑可能可能从可读性的角度来清理,现在我已经看了它几个月后。但它确实有效。

使用此功能,只需在按钮点击事件中调用this.Close();即可。然后,该事件处理提示并决定是否应该实际关闭。

+0

这工作,谢谢!随着我发现它更具可读性,我将使用此解决方案。 – AdamMc331

+0

很高兴为你工作。我可能会改变它在实际的关闭事件中包含'HasFormChanged',然后调用提示符,也许可以反转返回值以除去'!',但是无论如何。 – sab669

+0

我刚刚将我的方法更改为'IgnoreChanges()',它直观地返回yes以取消,否则返回。所以在FormClosing中,我读了'e.Cancel =!IgnoreChanges()'。我感觉合理!希望未来我调试的人也这么认为。 – AdamMc331

3

形式的财产的DialogResult正好被设置为枚举DialogResult.None

.... 
if (dr == DialogResult.Yes) 
{ 
    Close(); 
} 
else 
{ 
    this.DialogResult = DialogResult.None; 
} 

或者干脆:

if (dr != DialogResult.Yes) 
    this.DialogResult = DialogResult.None; 

因为按钮的属性DialogResult的未设置为表单自动关闭DialogResult.None在Forms Designer中。在这种情况下,WinForms引擎将采用该值并将其分配给整个表单的DialogResult属性,导致它自动关闭。这通常用于表单的调用代码以区分确认和取消按钮

在下面的示例中,假设在frmCustomers中有两个按钮,一个是DialogResult属性设置为DialogResult.OK,另一个设置为DialogResult.Cancel。现在,如果用户点击OK按钮,你知道,在调用代码如何为您的新客户

using(frmCustomers f = new frmCustomers()) 
{ 
    if(f.ShowDialog() == DialogResult.OK) 
    { 
     // Execute code to save a customer 
    } 
} 
+0

这很好,谢谢!尽管如此,我正在使用FormClosing解决方案,因为我认为它使事情更具可读性。 – AdamMc331