【问题标题】:Selecting an item from AutoComplete suggestion list raises KeyDown-event with ENTER key从自动完成建议列表中选择一个项目会引发带有 ENTER 键的 KeyDown-event
【发布时间】:2012-08-21 13:25:55
【问题描述】:

在 Winforms 中,我有一个 AutoCompleteMode 设置为 SuggestAppend 和一个 AutoCompleteCustomSource 设置的文本框。当用户键入一些字母时,会显示建议列表。如果通过鼠标单击选择了此列表中的某个项目,则会针对 ENTER 键引发包含文本框的表单的 KeyDown 事件。

用鼠标选择建议的项目时是否有可能不引发此事件?

【问题讨论】:

    标签: c# autocomplete textbox onkeydown


    【解决方案1】:

    自动完成功能有几个怪癖,这些怪癖是从其最初的设计用途继承而来的,即 Internet Explorer 的地址框。这包括在您单击列表中的项目时发出 Enter 键。在 IE 的地址框中按 Enter 键会导航到输入的 URL。

    对此您无能为力,本机界面 (IAutoComplete2) 几乎没有用于配置其工作方式的选项。它通过伪造 Windows 消息将击键插入文本框。这是您可以区分的一种方法,实际的密钥不会被关闭。您可以通过调用 GetKeyState() 进行检查,如下所示:

        private void textBox1_KeyDown(object sender, KeyEventArgs e) {
            if (e.KeyData == Keys.Enter && GetKeyState(Keys.Enter) < 0) {
                Console.WriteLine("Really down");
            }
        }
    
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern short GetKeyState(Keys key);
    

    【讨论】:

    • 非常感谢您的回答,这是一个有效的解决方案!我已经认识到使用自动完成功能有一些缺点。也许写一个自定义的自动完成文本框会更好。
    • 非常有用的答案。太糟糕了,MS 没有提供某种方法来确定是否使用了自动完成建议。如果他们突出显示建议并按 Enter 键,我想忽略 Enter 键。我什至查看了堆栈跟踪是否不同,但它们是相同的。如果您跟踪所有可能的方式来捕获输入(键盘、粘贴、其他?)并假设没有输入任何其他内容,则可能有一种方法。但我认为我可以不捕捉所有可能的情况。
    【解决方案2】:

    你可以捕捉 keydown 键:

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
        //Do nothing or something
        }
    }
    

    【讨论】:

    • 问题是在文本框中按回车键应该会激活其他一些操作,但只选择一个项目不应该这样做。因此,我需要在您的示例中的 KeyDown-handler 中找出事件是通过手动按下回车键引发的还是通过选择项目引发的。
    • 当用户按 Enter 或双击列表中的项目时,KeyDown 事件会触发 e.KeyCode = 13 (ENTER)。我认为您无法处理“输入”和单击事件之间的区别,因为它们被设置为触发相同的事件。您可以轻松完成的唯一方法是使用按钮激活“其他操作”
    猜你喜欢
    • 2012-09-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多