上下文菜单更新文本框的关键事件 - Windows窗体

时间:2017-03-01 06:32:23

标签: c# drop-down-menu textbox contextmenu

Textbox的自动完成属性不符合我的要求,因为我想在最初的下拉列表中以及当文本框为空时显示所有选项。

所以我想到了Context Menu。

它应该是这样的。 我订阅了TextBoxKeyDownKeyUp两个事件。 假设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的下一次试验。但它没有被提升。

指导我在这里做错了什么。

0 个答案:

没有答案