C# 上下文菜单更新Textbox-Windows窗体的关键事件
C# 上下文菜单更新Textbox-Windows窗体的关键事件,c#,drop-down-menu,textbox,contextmenu,C#,Drop Down Menu,Textbox,Contextmenu,Textbox的自动完成属性不能满足我的要求,因为我想在文本框为空时在下拉列表中显示所有选项 所以我想到了上下文菜单 应该是这样的。 我订阅了两个事件,分别是TextBox、KeyDown和keydup。 假设KeyDown将首先升高,然后keydup因此,在每次按键时,我都会根据文本框的文本加载上下文菜单,并显示下拉菜单,在每次按键时(假设用户仍在输入),发送Esc键关闭下拉菜单[在即将到来的按键事件中,它将显示正确的下拉菜单] 把我的代码放在下面 void txtIndi2_
Textbox
的自动完成属性不能满足我的要求,因为我想在文本框为空时在下拉列表中显示所有选项
所以我想到了上下文菜单
应该是这样的。
我订阅了两个事件,分别是TextBox
、KeyDown
和keydup
。
假设KeyDown
将首先升高,然后keydup
因此,在每次按键时,我都会根据文本框的文本加载上下文菜单,并显示下拉菜单,在每次按键时(假设用户仍在输入),发送Esc
键关闭下拉菜单[在即将到来的按键事件中,它将显示正确的下拉菜单]
把我的代码放在下面
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
我认为这是因为,一旦显示下拉列表,焦点就会从textbox上消失,但我在显示下拉列表后,以编程方式尝试将焦点放在textbox上。因此,在下一次尝试键入KeyDown
时,应该提高。但它并没有被提出
指导我这里做错了什么。不要听3个事件,为什么不听文本框更改事件。在textchange上,只需根据u vr条件重新加载下拉列表。@RaviKanth如果用户没有在TextBox中进一步键入,我需要下拉列表保持显示,一旦用户开始进一步键入,下拉列表应相应更新。现在在TextChange事件下拉列表是第一次(第一个字母)的完美选择,但它并没有在textbox上键入,也并没有更新下拉列表