Textbox+listbox实现自动完成功能

来源:互联网 发布:php过滤单引号双引号 编辑:程序博客网 时间:2024/05/01 02:19

以下是代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Test_AutoComplete
{
    public partial class Form1 : Form
    {
        AutoCompleteStringCollection autoCom;
        string annoPath = Application.StartupPath + @"/AutoComplete.txt";
        List<string> list_Annotate = new List<string>();
        public Form1()
        {
            InitializeComponent();
            //set to use custom source
            txtAnnotate.AutoCompleteSource = AutoCompleteSource.CustomSource;
            //set to show drop down list and append current suggestion to end
            txtAnnotate.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            //Init the autoCom
            autoCom = new AutoCompleteStringCollection();
            //set txtAnnotate's AutoComplete source to autoCom
            txtAnnotate.AutoCompleteCustomSource = autoCom;
        }
        private void loadAnnotateInfo(string path)
        {
            autoCom.Clear();//每加载一次该方法,就把autoCom集合清空一次
            list_Annotate.Clear();//每加载一次该方法,就把list_Annotate清空一次
            StreamReader sr = new StreamReader(path);
            sr.BaseStream.Seek(0, SeekOrigin.Begin);
            string line = sr.ReadLine();
            while(line != null)
            {
                autoCom.Add(line);
                list_Annotate.Add(line);
                line = sr.ReadLine();
            }
            sr.Close();
            sr.Dispose();
        }

        private void saveAnnotate(string path)
        {
            StreamWriter sw = new StreamWriter(path);
            sw.BaseStream.Seek(0, SeekOrigin.End);
            if (list_Annotate.Count == 0)
            {
                list_Annotate.Add(txtAnnotate.Text);
            }
            for (int i = 0; i < list_Annotate.Count; i++)
            {
                if (list_Annotate[i] == txtAnnotate.Text)
                {
                    list_Annotate.RemoveAt(i);
                }
            }
            list_Annotate.Add(txtAnnotate.Text);
            foreach (string str in list_Annotate)
            {
                sw.WriteLine(str);
            }
            sw.Flush();
            sw.Close();
            sw.Dispose();
        }

        private void btnAnnotate_Click(object sender, EventArgs e)
        {
            saveAnnotate(annoPath);
        }

        private void txtAnnotate_Enter(object sender, EventArgs e)
        {
            loadAnnotateInfo(annoPath);
        }

        private void txtAnnotate_TextChanged(object sender, EventArgs e)
        {
            listBox_Annotate.Items.Clear();
            if (txtAnnotate.Text.Length == 0)
            {
                hideResults();
                return;
            }
            if (list_Annotate.Count == 0)
            {
                list_Annotate.Add(txtAnnotate.Text);
            }
            foreach (string str in txtAnnotate.AutoCompleteCustomSource)
            {
                if (str.Contains(txtAnnotate.Text))
                {
                    listBox_Annotate.Items.Add(str);
                    listBox_Annotate.Visible = true;
                }
                else
                {
                    hideResults();
                }
            }
        }
        private void hideResults()
        {
            this.listBox_Annotate.Visible = false;
        }

        private void listBox_Annotate_SelectedIndexChanged(object sender, EventArgs e)
        {
            txtAnnotate.Text = listBox_Annotate.Items[listBox_Annotate.SelectedIndex].ToString();
            hideResults();
        }

        private void listBox_Annotate_Leave(object sender, EventArgs e)
        {
            hideResults();
        }
    }
}