无法检测到C#中的“Escape”键

3

首先向大家问候,这是我第一篇帖子。

我是C#的新手,所以解决方案可能很明显。

我有一个包含名称和日期数据的DataGridView。当双击日期列时,会显示DateTimePicker以选择日期。如果按下Escape键,则DateTimePicker将隐藏并恢复旧数据。 当运行代码并在最后一行中双击日期列时,DateTimePicker弹出,但不会读取Esc键。 如果在最后一行之前的某一行中执行相同的操作,则Esc键正常工作。 如果首先在其他某一行中执行相同的操作,然后在最后一行中执行相同的操作,则Esc键再次正常工作。 唯一的问题是当DateTimePicker首先在最后一行中激活时。也适用于Enter键

用于键盘读取和DateTimePicker处理

private void dateTimePicker1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter) { CellAddValue(1, dateTimePicker1.Value); }
    if (e.KeyCode == Keys.Escape) { CellAddValue(1, dateWhenSelDate); }
}

public void CellAddValue(int o, DateTime date)
{
    string dateString = date.ToString(dateFormat);
    if (DateTime.Compare(date, dateTimePicker1.MinDate) == 0) { dateString = ""; }
    dataGridView1.Rows[selectedRow].Cells[selectedColumn].Value = dateString;
    if (o == 1)
    {
        dateTimePicker1.Hide();
        dataGridView1.Focus();
    }
}

有没有一些设置或选项,我必须设置才能正常工作? 谢谢

2个回答

3

这是一个WinForm应用程序

请看Form.KeyPreview

您需要设置

From.KeyPreview = true;

感谢您的帮助。 它没有解决问题。 我仍然不知道为什么会这样。 我设法用其他方法做到了。 Datagrid 是 datetimepicker 的父级。通过更改它并调整选择器的位置,我获得了相同的效果。 - Djansr
1
我发现只要 Photoshop (CS2) 在运行,无论使用哪种方法,我都无法检测到 Escape。 - TaW

0

如果您想要详细控制所有按键,可以重写窗体的ProcessCmdKey方法,这样您就可以拦截所有按键事件:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    string keyName = keyData.ToString(); // You might rather use the Keys. enum

    if ("Escape".Equals(keyName))
    {
        Action();
        return true; // If you return true the key event won't be treated any further
    }
    else // pass the key on to your forms, they will be treated as if this method wasn't here
    {
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

我通常会用这个

formInstance.KeyPreview = true;

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey%28v=vs.110%29.aspx


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