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

标签 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,文本都会突出显示,并且它的值会设置为一个项目。 作为我想要的例子是: items 包含“Doe John”、“Smith John”、“Smith Marie”。 如果用户键入“John”,则下拉项为“Doe John”和“Smith John”,但如果他未单击任何下拉元素并退出 ComboBox(即单击外部),则文本仍为“John”

最佳答案

有一个 bool 变量 itemClicked

  • 在 Enter 事件处理程序中将 itemClicked 设置为 false
  • 在 SelectionChangeCommitted 事件处理程序中将 itemClicked 设置为 true
  • 将 Text 属性设置为字符串。如果 itemClicked 不是在 DropDownClosed 事件处理程序中,则为空

关于c# 防止自定义组合框自动选择项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39924888/

相关文章:

c# - 使用绑定(bind)设置用户控件中文本框的文本属性 - WPF

c# - 如何写入 "*.bat"文件?

c# - ListBox SelectedValueChanged/SelectedIndexChanged 在数据源更改时不触发

c# - 泄漏 Web 服务完成事件?

c# - dapper插入/更新需要内联sql吗?

c# - 视频上具有透明度的图像

c# - LibGit2Sharp Pull() 不 pull 已删除的文件

select - 农业网格 : ERROR TypeError: Cannot read property 'componentFromFramework' of null

c# - WPF MVVM : Binding to property of object

c# - 如何将 ComboBox 绑定(bind)到一列列表