我的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
InputBox
(AutoCompleteCustomSource
)上的TextBox
中包含TextChanged
个值。
我搜索它时工作正常,但是当我选择项目时,显然{{1}}事件再次触发,Text
Combobox
属性将重置。
如何解决这个问题?
答案 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 强>
答案 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;
}