C# WinForm TextBox猜想输入和历史记录输入(源码)
什么是猜想输入
当我们在使用查询应用时,输入某个关键字后文本框下面就会自动弹出跟此关键字相附的词组供我们选择,为我们节省了输入的时间,这就是猜想输入,例如:百度,谷歌,等等,如下图:
如上图所示,使用WinForm的TextBox实现了这样的效果,主要借助于TextBox的AutoCompleteMode和AutoCompleteSource以及AutoCompleteCustomSource属性。
详细参数
AutoCompleteMode
获取或设置控制自动完成如何作用于TextBox的选项。
属性值
Append 将最可能的候选字符串的其余部分追加到现有的字符,并突出显示追加的字符。
Suggest 显示与编辑控件关联的辅助下拉列表。 此下拉列表填充了一个或多个建议完成字符串。
SuggestAppend 追加 Suggest 和 Append 选项。
None 禁用自动完成 这是默认值。
AutoCompleteSource 获取或设置一个值,该值指定用于自动完成的完整字符串的源。
AutoCompleteCustomSource 获取或设置在 AutoCompleteSource 属性设置为 CustomSource 时使用的自定义 System.Collections.Specialized.StringCollection。
如下图:
代码设计
TextBoxRemind
public class TextBoxRemind { private string[] array = null; public void InitAutoCompleteCustomSource(TextBox textBox) { array = ReadTxt(); if (array != null && array.Length > 0) { AutoCompleteStringCollection ACSC = new AutoCompleteStringCollection(); for (int i = 0; i < array.Length; i++) { ACSC.Add(array[i]); } textBox.AutoCompleteCustomSource = ACSC; } } string[] ReadTxt() { try { if (!File.Exists("Remind.txt")) { FileStream fs = File.Create("Remind.txt"); fs.Close(); fs = null; } return File.ReadAllLines("Remind.txt", Encoding.Default); } catch { return null; } } public void Remind(string str) { StreamWriter writer = null; try { if (array != null && !array.Contains(str)) { writer = new StreamWriter("Remind.txt", true, Encoding.Default); writer.WriteLine(str); } } finally { if (writer != null) { writer.Close(); writer = null; } } } }
历史记录
由于存储的都是文本数据,所以采用了文本文档进行存储,轻量级操作方便,系统会自动创建Remind.txt文件。
加载窗体时首先初始化InitAutoCompleteCustomSource,添加AutoCompleteStringCollection,当我们点击确认后重新初始化数据源,加载之前录入的关键字。
public partial class Form1 : Form { private TextBoxRemind remind = null; public Form1() { InitializeComponent(); remind = new TextBoxRemind(); InitTextBoxRemind(); } void InitTextBoxRemind() { remind.InitAutoCompleteCustomSource(textBox1); } private void button1_Click(object sender, EventArgs e) { if (textBox1.Text.Trim() != "") { remind.Remind(textBox1.Text.Trim()); InitTextBoxRemind(); } } }
最后
大家经常遇到使用StreamReader和StreamWriter时中文不能正常显示,一个简单的方法就是将Encoding设置为Default即可。
附