@ Этан
Я забыл о том факте, что вы хотели бы сохранить это, чтобы это было не только для каждой сессии: P Но да, вы совершенно правы.
Это легко сделать, тем более что это просто базовые строки, просто выведите содержимое AutoCompleteCustomSource из TextBox в текстовый файл на отдельных строках.
У меня было несколько минут, поэтому я написал полный пример кода ... Я бы сделал это раньше, как всегда пытался показать код, но у меня не было времени. В любом случае, вот и все (за исключением кода дизайнера).
namespace AutoComplete
{
public partial class Main : Form
{
//so you don't have to address "txtMain.AutoCompleteCustomSource" every time
AutoCompleteStringCollection acsc;
public Main()
{
InitializeComponent();
//Set to use a Custom source
txtMain.AutoCompleteSource = AutoCompleteSource.CustomSource;
//Set to show drop down *and* append current suggestion to end
txtMain.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
//Init string collection.
acsc = new AutoCompleteStringCollection();
//Set txtMain's AutoComplete Source to acsc
txtMain.AutoCompleteCustomSource = acsc;
}
private void txtMain_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
//Only keep 10 AutoComplete strings
if (acsc.Count < 10)
{
//Add to collection
acsc.Add(txtMain.Text);
}
else
{
//remove oldest
acsc.RemoveAt(0);
//Add to collection
acsc.Add(txtMain.Text);
}
}
}
private void Main_FormClosed(object sender, FormClosedEventArgs e)
{
//open stream to AutoComplete save file
StreamWriter sw = new StreamWriter("AutoComplete.acs");
//Write AutoCompleteStringCollection to stream
foreach (string s in acsc)
sw.WriteLine(s);
//Flush to file
sw.Flush();
//Clean up
sw.Close();
sw.Dispose();
}
private void Main_Load(object sender, EventArgs e)
{
//open stream to AutoComplete save file
StreamReader sr = new StreamReader("AutoComplete.acs");
//initial read
string line = sr.ReadLine();
//loop until end
while (line != null)
{
//add to AutoCompleteStringCollection
acsc.Add(line);
//read again
line = sr.ReadLine();
}
//Clean up
sr.Close();
sr.Dispose();
}
}
}
Этот код будет работать точно так, как есть, вам просто нужно создать графический интерфейс с TextBox с именем txtMain и подключить события KeyDown, Closed и Load к форме TextBox и Main.
Также обратите внимание, что для этого примера и для простоты я просто решил обнаружить нажатие клавиши Enter в качестве моего триггера, чтобы сохранить строку в коллекции. Возможно, в зависимости от ваших потребностей было бы больше / разных мероприятий, которые были бы лучше.
Кроме того, модель, используемая для заполнения коллекции, не очень «умна». Он просто удаляет самую старую строку, когда коллекция достигает предела 10. Это, вероятно, не идеально, но работает для примера. Возможно, вы захотите использовать какую-то систему рейтинга (особенно, если вы действительно хотите, чтобы она была Google-ish)
Последнее замечание: предложения будут отображаться в том порядке, в котором они находятся в коллекции. Если по какой-то причине вы хотите, чтобы они отображались по-другому, просто отсортируйте список так, как вам нравится.
Надеюсь, это поможет!