ComboBox:如果操作员键入文本,然后按回车,则发生哪个事件

Posted

技术标签:

【中文标题】ComboBox:如果操作员键入文本,然后按回车,则发生哪个事件【英文标题】:ComboBox: which event if operator types text, then presses enter 【发布时间】:2021-07-16 17:19:51 【问题描述】:

我有一个包含一些有用项目的组合框。操作员可以从此列表中选择项目。我还想让操作员键入一些不在选择列表中的文本。

如果操作员指示他完成了对文本框的编辑,例如按下回车,我想检查操作员是否选择了一个项目,或者输入了一些新文本。

从Best way to get selected item OR entered text from combobox我了解到我可以像这样阅读文本框文本:

var operatorText = comboBox1.Txt;

但是我应该使用什么事件呢?

如果我输入一些文本并按 Enter 键,则不会引发 SelectedIndexChanged 对于操作员键入的每个字符都会引发 TextUpdate,但如果他按下回车键则不会 每次字符更改都会引发 TestUpdated,即使在选择之后也是如此,但如果按下 Enter 则不会。

我在编辑文本框后按 Enter 时听到“叮”的一声,所以应该发生一些事件,但是是哪一个?

【问题讨论】:

使用PreviewKeyDown Event 怎么样?您可以检查是否存在“输入”和/或“返回”键并执行您需要做的事情。 在 ComboBox.KeyDown 中:if (e.KeyCode == Keys.Enter) e.SuppressKeyPress = true; string text = comboBox1.Text; 这能回答你的问题吗? How do I capture the enter key in a windows forms combobox 然后你可以这样做,例如,bool exists = comboBox1.Items.OfType<object>().Any(itm => comboBox1.GetItemText(itm).Equals(text));。 -- 如果您有自定义控件,您可以获得编辑控件的句柄 (GetComboBoxInfo()) 并使用 NativeWindow 处理其所有消息(并在需要时引发自定义事件)。 解决方案来自 Jimi:(感谢 Jimi!)虽然 PreviewKeyDown 事件也可以检查 Keys.Enter,但阻止“Ding”的是 e.SuppressKeyPress。对于未来的读者,我会将其添加为答案,并向 Jimi 致敬 【参考方案1】:

Jimi 想出了正确的答案。订阅事件Control.KeyDown(不是KeyUp!),检查哪个键被按下,如果你认为操作员已经完成编辑,SuppressKeyPress,防止“叮”

private void OnParameterKeyDown(object sender, KeyEventArgs e)

    ComboBox combo = (ComboBox)sender;
    if (e.KeyCode == Keys.Return)
    
        this.ProcessSelectedText(combo.Text);
        e.SuppressKeyPress = true;
    

我选择不对 LostFocus 做出反应:如果操作员开始打字,但发现他犯了错误,他应该能够做其他事情,例如查找要输入的正确文本

另一种方法是,如果操作员按下回车键,您可以将键入的文本添加到项目列表中,以便选择项目。缺点:项目列表可能会变得很大,并且在列表中看到输入错误会很麻烦。

【讨论】:

【参考方案2】:

必须输入吗? 如果只是当用户从文本字段移动到新字段时,您可以使用 LostFocus (https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.lostfocus?view=net-5.0)

【讨论】:

不一定要输入,但对于操作员来说这是最自然的方式。将鼠标移开是不够的,对于 LostFocus,您必须单击其他位置

以上是关于ComboBox:如果操作员键入文本,然后按回车,则发生哪个事件的主要内容,如果未能解决你的问题,请参考以下文章

yundetectservice已停止工作然后电脑就上不了网了

如何在linux系统中快速切换目录

linux切换下一个目录自动打印

关于js中事件监听的问题(文本框 回车键 失去焦点)

Access表单上的文本框传递先前的值

linux登录密码忘记了怎么办