C# 退出表格-使用“退出”的优势;ProcessDialogKey";超过;KeyUp“;
要在按下ESC键时关闭窗体,我始终使用:C# 退出表格-使用“退出”的优势;ProcessDialogKey";超过;KeyUp“;,c#,winforms,C#,Winforms,要在按下ESC键时关闭窗体,我始终使用: protected override bool ProcessDialogKey(Keys keyData) //Exit form if Esc is pressed { if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape) { this.Close(); return true; } return ba
protected override bool ProcessDialogKey(Keys keyData) //Exit form if Esc is pressed
{
if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
{
this.Close();
return true;
}
return base.ProcessDialogKey(keyData);
}
private void frmMain_FormClosing(object sender, FormClosingEventArgs e) //Ask for confirmation when "X" is clicked
{
//Define a messagebox
const string message = "Are you sure that you want to exit the application?";
const string caption = "Close Application";
var result = MessageBox.Show(message, caption,
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
//Cancel the action if NO is clicked
e.Cancel = (result == DialogResult.No);
}
今天,我意识到,使用以下代码也可以实现这一点:
private void frmMain_KeyUp(object sender, KeyEventArgs e)
{
//Close form when ESC key is pressed
if (e.KeyCode == Keys.Escape)
{
this.Close();
}
}
private void frmMain_FormClosing(object sender, FormClosingEventArgs e) //Ask for confirmation when "X" is clicked
{
//Define a messagebox
const string message = "Are you sure that you want to exit the application?";
const string caption = "Close Application";
var result = MessageBox.Show(message, caption,
MessageBoxButtons.YesNo,
MessageBoxIcon.Question);
//Cancel the action if NO is clicked
e.Cancel = (result == DialogResult.No);
}
因此,我想知道遵循第一组代码是否有任何好处,因为第二组代码似乎更容易处理。一般来说,它们在技术上是不同的(按照执行顺序),但它们会做相同的事情。你不必对它过于谨慎 我会使用
ProcessDialogKey
,因为即使像TextBox
这样的控件包含焦点,表单的ProcessDialogKey
也会运行,而在这种情况下,表单的KeyDown
或keydup
仅当您将表单的keydreview
设置为true
时才会触发
下面是我将使用的代码:
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Escape)
{
this.Close();
return true;
}
return base.ProcessDialogKey(keyData);
}
它的工作方式很安静。只是为了玩,有人可能会说这两种方法都不适合此函数,因为表单类为此目的公开了
获取或设置用户按ESC键时单击的按钮控件
此属性的类型为IButtonControl
。因此表单本身可以实现该接口,并充当自己的CancelButton
public partial class Form1 : Form, IButtonControl
{
public Form1()
{
InitializeComponent();
CancelButton = this;
}
DialogResult IButtonControl.DialogResult
{
get {return DialogResult.OK;}
set {}
}
void IButtonControl.NotifyDefault(bool value) { }
void IButtonControl.PerformClick()
{
this.DialogResult = DialogResult.Cancel;
this.Close();
}
}
当然,如果表单显示实际的CancelButton,则应将其分配给Form.CancelButton属性。那么,如果我将表单的KeyPreview设置为True,您是说这两个代码相等吗?因为我总是这么做。他们在技术上是不同的(为了执行的顺序),但他们会做同样的事情。你不必对此过于谨慎。这正是我想要理解的。谢谢,解决了。我不知道我是否应该将你的答案标记为答案,因为你的评论回答了这个问题,而不是你的实际答案。在你方便的时候一定要提出建议。谢谢,我相信这篇文章回答了你的问题:)