如果我理解正確的話,我想你想隱藏組合框的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.
}
}
編輯: 另一個簡單的soution是使用,而不是TextChange
TextUpdate
事件,並保持你的組合框,因爲它是沒有創建另一個自定義控件。
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
僅當用戶在組合框中鍵入任何內容時,纔會調用事件。但是,不是當用戶從下拉列表中選擇項目時。所以,這不會增加項目。
如果您希望在兩種情況下都返回所有匹配的項目(Upper和Lower),您還可以更改where條件。假設你在列表1. Microsoft Sql Server, 2. microsoft office
中有兩個項目,那麼如果我只輸入microsoft
,結果會是什麼。
Where(s => s.ToLower().Contains(comboBox1.Text.ToLower()))
Sample Code
一個廉價的勝利將是設置一個布爾值在SelectionChanged事件......我相信在這兩種情況下發送者是一回事嗎? – Sayse 2014-09-04 10:14:45
@Sayse你說'SelectedValueCahnged'事件?當我選擇一個結果時,'comboBox1_TextChanged'和'comboBox1_SelectedValueChanged'事件'sender'''Text'屬性都是空字符串。 – 2014-09-04 13:13:30
是的我在想布爾的想法,你需要在[SelectedValueChanged](http://msdn.microsoft.com/en-us/library/system.windows.forms。listcontrol.selectedvaluechanged(v = vs.110).aspx)事件(爲false)表明您希望繞過事件。我的第二個想法是,發件人可能在輸入時爲null,而來自更改後的選擇時則爲combobox。 – Sayse 2014-09-04 13:18:43