模糊搜尋 - Winforms ComboBox

先假設模糊搜尋功能要運用在我的英文單字本小專案上:

製作此專案一開始是使用TextBox的AutoComplete功能,在搜尋上只能抓首字母
但由於我一直想實現相似於我們在網路搜尋引擎,那樣的關鍵字模糊搜尋,現在終於找到解方了!
只要輸入的關鍵字(intput string),哪些單字有含這些字母,就會列在ComboBox的items裡面,接著來直接看示例吧!

程式邏輯思維步驟:
1.在Form形成物件時,就對ComboBox的items collection,以programming的方式,加入所有單字的集合(從List<string> beforeSelected)。

2.在用戶輸入關鍵字搜尋後,以programming的方式,先清空ComboBox的items collection。此關鍵字成為篩選條件,將beforeSelected內的元素全部比對一遍,英文單字含有關鍵字的就加入新的集合(List<string> afterSelected)。----搭配ComboBox的TextUpdate事件。

3.再將ComboBox的items collection,以programming的方式,加入篩選後的集合(從List<string> afterSelected)。

4.ComboBox加入items後,使用DroppedDown=true,這時已經可以看到符合關鍵字的所有單字!

程式碼:
 


    public partial class Form1 : Form
    {
       

        public Form1()
        {
            InitializeComponent();

            string configPath=$@"C:\Users\ching\source\repos\A20200615\Vocabulary";
           
            /* 步驟1 */
            Form1.SetAutoCompleteComboBox(configPath, comboBox_Search);

        } 

   public static void SetAutoCompleteComboBox(string configPath, ComboBox comboBox)
        {
            /* 放所有單字的集合 */
            List<string> beforeSelected = new List<string>();
            /* 篩選後符合關鍵字的集合 */
            List<string> afterSelected = new List<string>();

            /* 得到此路徑下面的所有目錄=>單字資料夾 */
            string[] directories = Directory.GetDirectories(configPath);

            foreach (var directory in directories)
            {
                DirectoryInfo folder = new DirectoryInfo(directory);

                /* 把資料夾名稱一一存入篩選前集合 */
                beforeSelected.Add(folder.Name.ToLower());                 
            }


            /* 步驟2 */
            /* 清空comboBox items collection準備換成新的list datasource */
            if (comboBox.Items.Count!=0)
            {
                comboBox.Items.Clear();
            }

            /* 儲存用戶輸入的字元 */
            var input = comboBox.Text.ToLower();


            /* Form1物件形成時,或用戶刪除重新輸入關鍵字時,會進入此判斷式 */
            /* ComboBox搜尋框無字元 */
            if (string.IsNullOrEmpty(input))
            {    
                /* comboBox items collection加入篩選前集合 */
                comboBox.Items.AddRange(beforeSelected.ToArray());

            }
            else
            {
                /* 步驟2 */
                /* 篩選符合關鍵字的單字,加入新的集合 */
               
                foreach (var item in beforeSelected)
                {
                    if (item.IndexOf(input) >=0)
                    {
                        afterSelected.Add(item);
                    }
                }

                 /* comboBox items collection加入篩選後集合 */
                comboBox.Items.AddRange(afterSelected.ToArray());
                
                /* 這個Select方法解決了輸入游標不斷置回起始位置的問題 */
                comboBox.Select(comboBox.Text.Length, 0);
                comboBox.DroppedDown = true;
                
                /* 使用DroppedDown之後,鼠標箭頭消失在comboBox上,設定取得預設游標(箭號游標) */
                comboBox.Cursor = Cursors.Default;



            }

        }


        /* 步驟2搭配ComboBox的 TextUpdate事件 */
        private void comboBox_Search_TextUpdate(object sender, EventArgs e)
        {
            Form1.SetAutoCompleteComboBox(configPath, comboBox_Search);
        }




    }      

 

如有敘述錯誤,還請不吝嗇留言指教,thanks!