如何在组合框中选择项目时阻止TextChanged事件?

时间:2014-09-04 10:11:36

标签: c# winforms combobox

我的TextChanged上有ComboBox个事件,如<; p>

private void comboBox1_TextChanged(object sender, EventArgs e)
{
     foreach (var item in comboBox1.Items.Cast<string>().ToList())
     {
         comboBox1.Items.Remove(item);
     }

     foreach (string item in InputBox.AutoCompleteCustomSource.Cast<string>().Where(s => s.Contains(comboBox1.Text)).ToList())
     {
         comboBox1.Items.Add(item);
     }
}

作为解释,当我更改组合框的文本时,我想在string InputBoxAutoCompleteCustomSource)上的TextBox中包含TextChanged个值。

我搜索它时工作正常,但是当我选择项目时,显然{{1}}事件再次触发,Text Combobox属性将重置。

如何解决这个问题?

2 个答案:

答案 0 :(得分:7)

如果我理解正确,那么我想你想要隐藏组合框的TextChange事件。如果是,则可以创建由ComboBox继承的自定义控件并覆盖TextChange事件。

public partial class MyCombo : ComboBox
{
    public MyCombo()
    {
        InitializeComponent();
    }
    bool bFalse = false;
    protected override void OnTextChanged(EventArgs e)
    {
        //Here you can handle the TextChange event if want to suppress it 
        //just place the base.OnTextChanged(e); line inside the condition
        if (!bFalse)
            base.OnTextChanged(e);
    }
    protected override void OnSelectionChangeCommitted(EventArgs e)
    {
        bFalse = true;
        base.OnSelectionChangeCommitted(e);
    }
    protected override void OnTextUpdate(EventArgs e)
    {
        base.OnTextUpdate(e);
        bFalse = false; //this event will be fire when user types anything. but, not when user selects item from the list.
    }
}

<强>编辑: 另一个简单的方法是使用TextUpdate事件而不是TextChange,并保持你的组合框不变,而不创建另一个自定义控件。

private void myCombo1_TextUpdate(object sender, EventArgs e)
{
    foreach (var item in myCombo1.Items.Cast<string>().ToList())
    {
        myCombo1.Items.Remove(item);
    }

    foreach (string item in myCombo1.AutoCompleteCustomSource.Cast<string>().Where(s => s.Contains(myCombo1.Text)).ToList())
    {
        myCombo1.Items.Add(item);
    }
}
仅当用户在组合框中输入任何内容时,

TextUpdate事件才会调用。但是,当用户从下拉列表中选择项目时。所以,这不会重新添加添加的项目。

如果您希望在两种情况下(上部和下部)返回所有匹配的项目,也可以更改where条件。假设您在列表1. Microsoft Sql Server, 2. microsoft office中有两个项目,那么如果我只键入microsoft,结果会是什么。

Where(s => s.ToLower().Contains(comboBox1.Text.ToLower()))

<强> Sample Code

enter image description here

答案 1 :(得分:0)

正如@Sayse已经说过:

添加布尔值:

private bool codeCalled = new bool();

在你的textChanged:

if(codeCalled == true)
{
    codeCalled = false;   
    return;
}
else
{
     codeCalled = true;
    //your foreachcode here        
}

这应该可以解决问题。

经过测试并正在使用。

也经过测试和工作,也不优雅:

private void textBox_TextChanged(object sender, EventArgs e)
{
    textBox.TextChanged -= textBox_TextChanged;

    //yourcode

    textBox.TextChanged += textBox_TextChanged;
}