C# 选择listbox项时获取CheckedListBox控件中的键事件

C# 选择listbox项时获取CheckedListBox控件中的键事件,c#,winforms,C#,Winforms,我使用CheckedListBox作为自定义DataGridView单元格类编辑模式的基础。我想在用户按下escape键时关闭编辑。如果用户没有选择任何内容,则覆盖OnKeyDown可以完美地工作。问题是,如果它们执行OnKeyDown(和OnKeyPressed),则CheckedListBox不会激发它们;相反,行项目取消选择自身并吃掉事件。这意味着,如果用户通过单击列表中的任何项目进行选择,则需要按两次escape键才能关闭编辑。一个用于取消选择他们单击的行,另一个用于取消编辑模式。尝试覆

我使用CheckedListBox作为自定义DataGridView单元格类编辑模式的基础。我想在用户按下escape键时关闭编辑。如果用户没有选择任何内容,则覆盖OnKeyDown可以完美地工作。问题是,如果它们执行OnKeyDown(和OnKeyPressed),则CheckedListBox不会激发它们;相反,行项目取消选择自身并吃掉事件。这意味着,如果用户通过单击列表中的任何项目进行选择,则需要按两次escape键才能关闭编辑。一个用于取消选择他们单击的行,另一个用于取消编辑模式。

尝试覆盖自定义DataGridView本身上的IsInputKey,如果是[Esc],则返回false,这样网格将忽略Esc


如果在“编辑模式”或类似模式下没有输入键,您可以通过忽略输入键来增强此行为。

为了访问转义键,我必须更改IDataGridViewEditingControl.EditingControlWantInputKey(相当于普通控件上的IsInputKey)的行为,以将转义传递给我的OnKeyDown事件

/// <summary>
/// Implements the IDataGridViewEditingControl.EditingControlWantsInputKey method.
/// </summary>
/// <param name="key"></param>
/// <param name="dataGridViewWantsInputKey"></param>
/// <returns></returns>
public bool EditingControlWantsInputKey(Keys key, bool dataGridViewWantsInputKey)
{
    // Let the custom edit control handle the keys listed.
    switch (key & Keys.KeyCode)
    {
        case Keys.Escape:
            return true;
        default:
            return !dataGridViewWantsInputKey;
    }
}
//
///实现IDataGridViewEditingControl.EditingControlWantInputKey方法。
/// 
/// 
/// 
/// 
公共bool编辑控制WANTINSPUTKEY(Keys key,bool DataGridViewWANTINSPUTKEY)
{
//让自定义编辑控件处理列出的键。
开关(钥匙和钥匙。钥匙代码)
{
箱子钥匙。逃生:
返回true;
违约:
return!DataGridViewWantInputKey;
}
}

我尝试在我的CellEditControl上覆盖它,但当按下escape键时,将其更改为返回true而不是false仍然无法使其到达CellEditControl的KeyDownEvent。从IsInputKey()中显式调用OnKeyDown()可以实现我想要的;但是这是一个令人讨厌的乱七八糟的问题。原来问题出在
IDataGridViewEditingControl上。EditingControlWantInPutKey
我根本不需要触摸IsInputKey,因为这个方法让你做同样的事情,然后启动并破坏我试图在IsInputKey中做的更改。啊,说得好。是的,自定义DataGridView控件在处理其事件时总是有点棘手。另外,建议你发布自己对这个问题的答案,然后选择它作为答案。然后,任何提出类似问题的人都可以找到你的答案。