我正在研究texteditor,我想知道如何实现自动完成功能。
我在单独的类(KeyWord.cs)中有这个字符串集合
public String[] keywords = { "abstract", "as", "etc." };
public String[] events = { "AcceptRejectRule", "AccessibleEvents", "etc.2" };
我已经在我的mainform中输入了ListBox(lb)中的字符串,这些字符串已经排序了:
lb = new ListBox();
Controls.Add(lb);
//lb.Visible = false;
KeyWord keywordsL = new KeyWord();
KeyWord eventsL = new KeyWord();
foreach (string str in keywordsL.keywords)
{
lb.Items.Add(str);
}
foreach (string str in eventsL.events)
{
lb.Items.Add(str);
}
和作为编辑器的RichTextBox(也有高亮选项)声明为rtb。
现在我担心的是,我怎么能把它变成像“contexthint”一样,当我在RichTextBox(rtb)中键入字母“A”时,隐藏的列表框将出现在鼠标指针所在的位置然后全部将出现列表框中列出的字符串开始的“A”。最后,当我从列表框中选择显示的字符串时,字符串将添加到RichTextBox中?
答案 0 :(得分:0)
实现这一目标的简单方法是执行以下操作:
private List<string> autoCompleteList = new List<string>();
public Form1()
{
autoCompleteList.Add("Items for the autocomplete");
}
...
private void textBox1_TextChanged(object sender, System.EventArgs e)
{
listBox1.Items.Clear();
if (textBox1.Text.Length == 0)
{
hideAutoCompleteMenu();
return;
}
Point cursorPt = Cursor.Position;
listBox1.Location = PointToClient(cursorPt);
foreach (String s in autoCompleteList)
{
if (s.StartsWith(textBox1.Text))
{
listBox1.Items.Add(s);
listBox1.Visible = true;
}
}
}
private void hideAutoCompleteMenu()
{
listBox1.Visible = false;
}
private void listBox1_SelectedIndexChanged(object sender, System.EventArgs e)
{
textBox1.Text = listBox1.Items[listBox1.SelectedIndex].ToString();
hideAutoCompleteMenu();
}
但是,在实现此功能时,您必须考虑所有可能的极端情况,例如
虽然上面的一些问题只是处理其他事件的问题,但上面显示的代码是一种非常快速和肮脏的方式来实现你想要的东西,但实际上你正在做的是重新发明什么是轮子已有。我建议您查看AvalonEdit和FastColoredTextBox中的源代码,看看这是如何完成的。