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」を入力したときのように、「contexthint」のようにするにはどうすればよいかということでした。非表示のリストボックスがマウスポインターがあった位置に表示され、次にすべての「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 に答える