C# 设置ComboBox.DroppedDown=false将重置选定项

C# 设置ComboBox.DroppedDown=false将重置选定项,c#,winforms,C#,Winforms,我有一个自定义组合框,它继承Forms.ComboBox类。其数据源已绑定。 其属性初始化如下: this.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; this.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; this.DropDownStyle = ComboBoxStyle.DropDown; OnDropD

我有一个自定义组合框,它继承Forms.ComboBox类。其数据源已绑定。 其属性初始化如下:

this.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;
this.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems;
this.DropDownStyle = ComboBoxStyle.DropDown;
OnDropDown将其自动完成模式设置为无,然后在OnDropDownClosed中,将其设置为再次建议(以避免此处描述的问题)

我实现了一个逻辑来验证组合框,并在键入某些文本时选择第一个匹配项

当显示下拉列表且用户键入内容并按Enter键时,将选择第一个匹配项。然后我想关闭下拉列表。我通过将ComboBox.DroppedDown属性设置为false来实现。问题是,当下拉列表以这种方式关闭时,所选项目将重置为以前选择的项目。不会调用OnSelectedIndexChanged、OnSelectionChangeCommitted和OnSelectedValueChanged

我通过记住在OnSelectedIndexChanged中选择的索引,并在OnDropDownClosed中再次设置它(在下拉菜单手动关闭的情况下)

问题: 当ComboBox的下拉属性设置为false时,为什么所选项目、索引、文本和值会重置?有没有其他方法可以手动关闭组合框而不会产生这种副作用

编辑:用于说明问题的代码:

List<string> list = new List<string>();
            list.Add("item0");
            list.Add("item1");
            list.Add("item2");
            list.Add("item3");
            list.Add("item4");

            customComboBox1.DataSource = list;
控制台输出如下所示(所选项目:0,按Enter键时尝试更改为2,关闭后下拉索引仍为0):

OnSelectedIndex已更改0项0

OnSelectedIndex已更改2项2

输入-before DroppedDown=false 2项2

OnDropDown0已关闭项2

输入-after DroppedDown=false 0项2


我发现设置SelectedItem比设置SelectedIndex更可靠

//这也将更改SelectedIndex并触发SelectedItemChanged事件


this.SelectedItem=this.Items[idx]

我发现设置SelectedItem比设置SelectedIndex更可靠

//这也将更改SelectedIndex并触发SelectedItemChanged事件


this.SelectedItem=this.Items[idx]

实际上,在问这个问题之前,我已经在做了。我想知道为什么会出现这种情况,以及是否有其他办法来解决它。但是因为没有人回答,而且这是我最后做的事情,我把这个标记为答案。实际上在问这个问题之前,我已经在做了。我想知道为什么会出现这种情况,以及是否有其他办法来解决它。但既然没有其他人回答,而且这是我最终要做的事情,我就把这个标记为答案。
public class CustomComboBox : ComboBox
    {

        public CustomComboBox(){ }

        #region OnKeyDown
        protected override void OnKeyDown(KeyEventArgs e)
        {
            if (!this.Enabled) e.Handled = true;
            else
            {
                base.OnKeyDown(e);
                if (e.KeyCode == Keys.Enter)
                {
                    this.SelectedIndex = 2; // index changes here

                    Console.WriteLine("ENTER - before DroppedDown=false " +
                        this.SelectedIndex + " " + this.Text);

                    if (this.DroppedDown)
                    { 
                        // here index = 2, text = Item2
                        this.DroppedDown = false; 
                        // here index = previous index, text is still Item2
                        // different thing is displayed than is actually chosen
                        // OnSelectedIndexChanged wasn't raised
                    }

                    Console.WriteLine("ENTER - after DroppedDown=false " +
                        this.SelectedIndex + " " + this.Text);

                    e.Handled = true;
                }
            }
        }
        #endregion

        #region OnSelectedIndexChanged
        protected override void OnSelectedIndexChanged(EventArgs e)
        {
             Console.WriteLine("OnSelectedIndexChanged " +
                 this.SelectedIndex + " " + this.Text);

                base.OnSelectedIndexChanged(e);
        }
        #endregion

        #region OnDropDownClosed

        protected override void OnDropDownClosed(EventArgs e)
        {
            Console.WriteLine("OnDropDownClosed " +
                 this.SelectedIndex + " " + this.Text);

            base.OnDropDownClosed(e);


        }

        #endregion

    }
    protected override void OnDropDownClosed(EventArgs e)
    {
        Console.WriteLine("OnDropDownClosed " +
             this.SelectedIndex + " " + this.Text);


        int idx = this.SelectedIndex;

        base.OnDropDownClosed(e);

        this.SelectedIndex = idx;


    }