0

我正在使用 texteditor,我想知道如何实现自动完成功能。

我在单独的类中有这个字符串集合(KeyWord.cs)

public String[] keywords = { "abstract", "as", "etc." };
public String[] events = { "AcceptRejectRule", "AccessibleEvents", "etc.2" };

我已经在位于我的主窗体的 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。

现在我担心的是,当我在 RichTextBox(rtb) 中输入字母“A”时,如何让它像它的“上下文提示”一样,隐藏的列表框将出现在鼠标指针所在的位置,然后是所有“A”在列表框中列出的字符串的开头将出现。最后,当我从列表框中选择显示的字符串时,该字符串将被添加到 RichTextBox 中?

4

1 回答 1

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 会发生什么?
  • 如果用户失去对富文本框的关注会发生什么?
  • 在列表框打开时如何处理向上和向下箭头键?
  • 在列表框中搜索大量项目时的性能问题?

虽然上面的一些问题只是处理额外事件的问题,但上面显示的代码是一种非常快速和肮脏的方式来实现你想要的东西,但实际上你所做的似乎是为已经可用的东西重新发明轮子。我建议您查看 AvalonEdit 和 FastColoredTextBox 中的源代码,看看它是如何真正完成的。

于 2013-03-02T06:11:01.417 回答