【发布时间】: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; } -
然后你可以这样做,例如,
bool exists = comboBox1.Items.OfType<object>().Any(itm => comboBox1.GetItemText(itm).Equals(text));。 -- 如果您有自定义控件,您可以获得编辑控件的句柄 (GetComboBoxInfo()) 并使用 NativeWindow 处理其所有消息(并在需要时引发自定义事件)。 -
解决方案来自 Jimi:(感谢 Jimi!)虽然 PreviewKeyDown 事件也可以检查 Keys.Enter,但阻止“Ding”的是 e.SuppressKeyPress。对于未来的读者,我会将其添加为答案,并向 Jimi 致敬