在C# WinForm TextBox实现联想输入(suggest)和历史记录输入
我想,现在已无法考证是谁先发明联想输入(suggest)这种很人性化的输入方式的,也无法说清林是C/S框架下先用,还是B/S框架中先用。我们也不用讨论前面这些问题,我只想说大家都知道联想输入指的什么吧?如果不明白,那百度或GOOGLE的搜索输入框就应用了这种输入技术,即你输入一个“js”,它可能会跟你联想出相关的词条来,比如:JS特效,js冲突等,当然,本文是在c# form中实现的联想输入外加历史输入,当然有人把联想输入称着suggest哟...算是跟你扩展点知识吧!下面我们就来具体讲解在c# form中实现的方案:
当我们在使用查询应用时,输入某个关键字后文本框下面就会自动弹出跟此关键字相附的词组供我们选择,为我们节省了输入的时间,这就是猜想输入,例如:百度,谷歌,等等,如下图:
如上图所示,使用WinForm的TextBox实现了这样的效果,主要借助于TextBox的AutoCompleteMode和AutoCompleteSource以及AutoCompleteCustomSource属性。
详细参数
AutoCompleteMode
获取或设置控制自动完成如何作用于TextBox的选项。
属性值
Append 将最可能的候选字符串的其余部分追加到现有的字符,并突出显示追加的字符。
Suggest 显示与编辑控件关联的辅助下拉列表。 此下拉列表填充了一个或多个建议完成字符串。
SuggestAppend 追加 Suggest 和 Append 选项。
None 禁用自动完成 这是默认值。
AutoCompleteSource 获取或设置一个值,该值指定用于自动完成的完整字符串的源。
AutoCompleteCustomSource 获取或设置在 AutoCompleteSource 属性设置为 CustomSource 时使用的自定义 System.Collections.Specialized.StringCollection。
如下图:
代码:
{
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;
}
}
}
}
历史记录
{
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即可。附上源码,以便参考: [点击浏览该文件:TextBoxRemindTest.zip]