【发布时间】:2011-04-01 09:40:43
【问题描述】:
我有一个小窗体,当我在 Windows 窗体应用程序中按下按钮时会出现。
我希望能够通过按退出键来关闭表单。我怎么能这样做?我不确定要使用的事件。 form_close?
【问题讨论】:
-
有关替代解决方案,请参阅 Hans Passant 在此线程上的回答:stackoverflow.com/questions/2290959/…
我有一个小窗体,当我在 Windows 窗体应用程序中按下按钮时会出现。
我希望能够通过按退出键来关闭表单。我怎么能这样做?我不确定要使用的事件。 form_close?
【问题讨论】:
如果您的表单上有一个取消按钮,您可以将 Form.CancelButton 属性设置为该按钮,然后按 Escape 将有效地“单击该按钮”。
如果您没有这样的按钮,请查看 Form.KeyPreview 属性。
【讨论】:
如果您已经在表单上有一个关闭表单的按钮,您可以在表单上设置一个属性来为您执行此操作。
将表单的CancelButton 属性设置为该按钮。
获取或设置用户按下Esc键时点击的按钮控件。
如果您没有取消按钮,那么您需要添加 KeyDown 处理程序并检查其中的 Esc 键:
private void Form_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
this.Close();
}
}
您还必须将 KeyPreview 属性设置为 true。
获取或设置一个值,该值指示在将事件传递给具有焦点的控件之前表单是否会接收键事件。
然而,正如 Gargo 在他的 answer 中指出的那样,这意味着按 Esc 中止对对话框中控件的编辑也将具有关闭对话框的效果。为避免覆盖ProcessDialogKey 方法,如下所示:
protected override bool ProcessDialogKey(Keys keyData)
{
if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
{
this.Close();
return true;
}
return base.ProcessDialogKey(keyData);
}
【讨论】:
Button cancelBTN = new Button();
cancelBTN.Size = new Size(0, 0);
cancelBTN.TabStop = false;
this.Controls.Add(cancelBTN);
this.CancelButton = cancelBTN;
【讨论】:
我发现最好的方法是覆盖“ProcessDialogKey”函数。这种方式仍然可以取消打开的控件,因为只有在没有其他控件使用按下的键时才会调用该函数。
这与设置 CancelButton 时的行为相同。使用 KeyDown 事件总是会触发,因此即使它应该取消对打开的编辑器的编辑,表单也会关闭。
protected override bool ProcessDialogKey(Keys keyData)
{
if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
{
this.Close();
return true;
}
return base.ProcessDialogKey(keyData);
}
【讨论】:
将此代码粘贴到表单的“On Key Down”属性中,同时确保将“Key Preview”属性设置为“Yes”。
If KeyCode = vbKeyEscape Then DoCmd.Close acForm, "YOUR FORM NAME"
【讨论】: