1. 程式人生 > >c# 實現ComboBox自動模糊匹配

c# 實現ComboBox自動模糊匹配

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模糊查詢,自動匹配的效果。

文中的錯漏,請回復糾正。