在RichTextBox中键入单词时将出现隐藏列表框

时间:2013-03-02 04:58:15

标签: c# winforms autocomplete

我正在研究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中?

1 个答案:

答案 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();
}

但是,在实现此功能时,您必须考虑所有可能的极端情况,例如

  • 如果用户在输入内容时按ESC / Enter键会发生什么?
  • 如果用户失去对richtextbox的关注会怎样?
  • 列表框打开时如何处理向上和向下箭头键?
  • 当列表框中有大量要搜索的项目时会出现性能问题吗?

虽然上面的一些问题只是处理其他事件的问题,但上面显示的代码是一种非常快速和肮脏的方式来实现你想要的东西,但实际上你正在做的是重新发明什么是轮子已有。我建议您查看AvalonEdit和FastColoredTextBox中的源代码,看看这是如何完成的。