ComboBox自帶有屬性可以實現自動匹配,但是它有一個弊端,只能從頭開始匹配,例如"李四LS",只能輸入“李四”或"李"才能匹配出來,而輸入"LS"是找不出來的。
綁定到ComboBox的下拉選項中的后台數據:
string[] data = new string[] { "張三|ZS", "李四|LS", "王五|WW", "趙六|ZL", "田七|TQ" };
先展示如何通過AutoComplete實現自動匹配
comAutoSelect.Items.AddRange(data); comAutoSelect.AutoCompleteMode = AutoCompleteMode.SuggestAppend; comAutoSelect.AutoCompleteSource = AutoCompleteSource.ListItems;
這樣,在前台輸入"張三"會自動匹配出下拉選項"張三|ZS",輸入"ZS",沒有其他下拉選項。
手動綁定是通過TextUpdate來實現,這里也考慮過TextChanged事件來實現,但是TextChanged事件和DroppedDown = true,以及鍵盤的上下鍵選擇有沖突,因此選用TextUpdate事件。
comAutoSelect.Items.AddRange(data); comAutoSelect.TextUpdate += (a, b) => { var input = comAutoSelect.Text.ToUpper(); comAutoSelect.Items.Clear(); if (string.IsNullOrWhiteSpace(input)) comAutoSelect.Items.AddRange(data); else { var newList = data.Where(x => x.IndexOf(input, StringComparison.CurrentCultureIgnoreCase) != -1).ToArray(); comAutoSelect.Items.AddRange(newList); } comAutoSelect.Select(comAutoSelect.Text.Length, 0); comAutoSelect.DroppedDown = true; //保持鼠標指針形狀 Cursor = Cursors.Default; };
主要的思路是當前台的文字改變時,刷新Items屬性。有幾個要注意。
1.不能用DataSource,因為綁定數據之后就不行對Items執行clear和add事件;另外,綁定數據后會默認選擇第一行,如果需要輸入多個字符,這樣會產生全選,覆蓋的輸入效果。
2.在完成外Items的賦值后,執行comAutoSelect.Select(comAutoSelect.Text.Length, 0);將光標移到輸入的最后,否則輸入的文字會跟理想的字符串倒序。將光標移到最后可以用以下兩種方法:
comAutoSelect.Select(comAutoSelect.Text.Length, 0);
comAutoSelect.SelectionStart = comAutoSelect.Text.Length;
3.可能對DroppedDown賦值的影響,光標被覆蓋在界面下面了。需要增加一句Cursor = Cursors.Default;保持鼠標指針的形狀。
TextUpdate的方法,實現了ComboBox模糊查找,自動匹配的效果。
文中的錯漏,請回復糾正。
轉載請注明出處:http://www.cnblogs.com/icyJ