Textbox
的自动完成属性不符合我的要求,因为我想在最初的下拉列表中以及当文本框为空时显示所有选项。
所以我想到了Context Menu。
它应该是这样的。
我订阅了TextBox
,KeyDown
和KeyUp
两个事件。
假设KeyDown
先升,然后KeyUp
。 所以在每个KeyUp上,我按照TextBox的文本加载上下文菜单并显示下拉列表和每个KeyDown(假设用户仍在输入)发送Esc
键以关闭下拉列表[和即将发布的KeyUp事件将显示正确的下拉列表]
把我的代码放在下面。
void txtIndi2_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
{
mnuIndi2.MenuItems.Clear();
foreach (string indi in IndicatorList)
{
if (txtIndi2.Text == "" || indi.ToLower().StartsWith(txtIndi2.Text.ToLower()))
{
MenuItem mnuItmIndi2 = new MenuItem(indi);
mnuItmIndi2.Click += mnuItmIndi2_Click;
mnuIndi2.MenuItems.Add(mnuItmIndi2);
//indiOptions.Add(indi);
}
}
using (System.IO.StreamWriter writer = new System.IO.StreamWriter("Log.txt", true))
{
writer.WriteLine("KeyUp " + txtIndi2.Text);
}
mnuIndi2.Show(txtIndi2, new Point(0, txtIndi2.Location.Y + 20));
txtIndi2.Focus();
}
void txtIndi2_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
using (System.IO.StreamWriter writer = new System.IO.StreamWriter("Log.txt", true))
{
writer.WriteLine("KeyDown " + txtIndi2.Text);
}
SendKeys.Send("{ESC}");
}
如果我删除上下文菜单显示和发送Esc密钥相关代码,意味着流和序列正确,则日志似乎是正确的。 但是使用上面显示的代码,它不是第一次提升事件。如果我尝试键入"打开"日志就像
> KeyDown
> KeyUp o
> KeyUp o
我认为这是因为,一旦显示下拉列表,焦点就会远离文本框,但我会在显示下拉列表后以编程方式尝试将焦点放在文本框上。因此,应该提出键入KeyDown
的下一次试验。但它没有被提升。
指导我在这里做错了什么。