c#阻止自定义组合框自动选择项目

时间:2016-10-07 19:56:52

标签: c# winforms combobox

我正在尝试在C#中实现我自己的ComboBox类,因为,直到3.5 .NET Framework(如果我没有误解)建议查找是使用" StartWith"功能(即,如果列表包含" Doe,John"以及用户类型" John",则不显示该项目)。基本上我是在文本更改事件中添加或删除项目,从列表的初始内容中获取它们。一切都适合我正在寻找的东西,唯一的问题是,当单击ComboBox时,即使它不等于插入的文本,仍然会选择一个项目。按照我做的例子,我想要那个" Doe,John"只有当用户点击它时,才会选择(并设置为ComboBox.Text属性),如果用户只输入" John"并且没有项严格等于它(不仅仅包含它),然后Text属性必须保留为用户插入它。这是我派生类的代码

public class customTB : ComboBox
{
    private object[] startlist;
    public customTB() : base()
    {
        this.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.None;
        this.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.None;
        this.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDown;
        this.Sorted = true;
        this.KeyPress += customTB_KeyPress;
        this.TextChanged += customTB_TextChanged;
        this.Enter += customTB_Enter;
    }

    void customTB_Enter(object sender, EventArgs e)
    {
        this.DroppedDown = (this.Items.Count > 0);
    }

    void customTB_TextChanged(object sender, EventArgs e)
    {
        UpdateList();
    }

    void customTB_KeyPress(object sender, KeyPressEventArgs e)
    {
        this.DroppedDown = (this.Items.Count>0);
    }

    void UpdateList()
    {
        if (this.startlist == null)
        {
            //get starting lists elems
            this.startlist = new Object[this.Items.Count];
            this.Items.CopyTo(this.startlist, 0);
        }
        this.BeginUpdate();
        foreach (object o in startlist)
        {
            if (o.ToString().Contains(this.Text))
            {
                if (!this.Items.Contains(o))
                    this.Items.Add(o);
            }
            else if (this.Items.Contains(o))
                this.Items.Remove(o);
        }
        this.EndUpdate();
    }
}

如果尝试过,只要您尝试退出ComboBox,就会突出显示文本并将其值设置为项目。 作为我想要的例子是: 项目包含" Doe John"," Smith John"," Smith Marie"。 如果用户键入" John",则下拉项目为" Doe John"和史密斯约翰"但如果他没有点击任何下拉元素并退出ComboBox(即点击外面),那么文本仍然是" John"

1 个答案:

答案 0 :(得分:0)

有一个布尔变量itemClicked

  • 在Enter event handler
  • 中将itemClicked设置为false
  • 在SelectionChangeCommitted事件处理程序
  • 中将itemClicked设置为true
  • 如果不是DropDownClosed事件处理程序中的itemClicked,则将Text属性设置为string.Empty