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上键入,也并没有更新下拉列表