C# 组合框用户控件无法正常运行

C# Combobox user control does not funtion as it should

我正在修复一个使用名为 CompleteComboBox 的用户控件的 c# 项目。

部分功能。

  1. 退格键不起作用。

  2. 用户第一次在 textbox 部分输入字符串时,列表会正常打开,并位于右行。第二次 - 列表没有打开,但确实在 textbox 部分显示了匹配的行。然后,如果我打开列表并开始写其中一个项目的开头,然后单击其中一个项目并按 enter - 未选择该项目,而是在 text box 部分输入字母时选择的项目.

希望我被理解。

代码如下:

 namespace BestInvest.UserControls
{
public partial class CompleteComboBox : System.Windows.Forms.ComboBox
{
    public event System.ComponentModel.CancelEventHandler NotInList;

    private bool _limitToList = true;
    private bool _inEditMode = false;

    bool start;

    public CompleteComboBox()
        : base()
    {

        start = true;
        this.Text = ClsConsts.InitializeTextForCombo;

    }

    [Category("Behavior")]
    public bool LimitToList
    {
        get { return _limitToList; }
        set { _limitToList = value; }
    }

    protected virtual void OnNotInList(System.ComponentModel.CancelEventArgs e)
    {
        if (NotInList != null)
        {
            NotInList(this, e);
        }
    }

    protected override void OnTextChanged(System.EventArgs e)
    {
        if (_inEditMode)
        {
            string input = Text;
            int index = FindString(input);

            if (index >= 0)
            {
                _inEditMode = false;
                SelectedIndex = index;
                _inEditMode = true;
                Select(input.Length, Text.Length);
                //base.DroppedDown = true;
            }
        }

        base.OnTextChanged(e);
    }

    protected override void OnValidating(System.ComponentModel.CancelEventArgs e)
    {
        if (this.LimitToList)
        {
            int pos = this.FindStringExact(this.Text);

            if (pos == -1)
            {
                OnNotInList(e);
            }
            else
            {
                this.SelectedIndex = pos;
            }
        }

        base.OnValidating(e);
    }

    protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
    {
        if (start)
        {
            base.DroppedDown = true;
            //else
            start = false;
        }

        if (e.KeyCode == Keys.Enter)
        {
            base.DroppedDown = false;
            start = true;
        }

        _inEditMode = true;

        base.OnKeyDown(e);
    }
}

}

你的代码很乱。查看 start 标志。它并非在您期望的所有情况下都设置为 true。这就是第一次行为不同于第二次的原因。

您的 OnKeyDown 事件不会在您期望的所有键上触发。这就是退格键不起作用的原因。有几篇关于检测退格键的帖子:See for example this one