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

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

轉載請注明出處:http://www.cnblogs.com/icyJ


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM