1

Richtextboxから派生したコントロールに次のテキストを入力しました

「世界は{美しい}」。

私の主な目的は、「美しい」という言葉へのリンクを作成することです。これはCFE_LINKを使用して作成できますが、テキストを選択するときです。

Select(4,9)を使用すると、4〜9の範囲のテキストが削除されます。

誰かが私が見逃しているものを手伝ってくれますか?

コード:

Richtextboxから派生したユーザーコントロールを作成しています。

以下に正確なコードを示します。色の変更は行っていません。Selectコマンドは、選択したテキストをデフォルトで青に設定していると思います。

protected override void OnKeyPress(KeyPressEventArgs e)
{
   String keypressed =  e.KeyChar.ToString();
   if(keypressed == "}")
      Select(4,9)        
   base.OnKeyPress(e);
}
4

4 に答える 4

2

'}'キーを押すと、文字がテキストボックスに送信される前にコードが実行されると思われます。

したがって、テキストを選択すると、「}」文字がテキストボックスに送信され、選択内容が上書きされます。

編集:うん、それを再現した。

どうやって解決すればいいのかわからない。代わりに実装する方がよいかもしれませんOnTextChanged。テキストボックス全体をスキャンして、リンクされていない{中括弧内の単語}を探すことができます。テキストが大きい場合は遅くなる可能性がありますが、コピーアンドペーストなどは自動的に処理されます。

于 2009-05-21T13:18:13.743 に答える
2

最初、これをいじり始めたとき、私も戸惑いました。しかし、それは私を襲いました。押されているキーがテキストボックスに送信されてKeyUpでレンダリングされている可能性があります。案の定、私があなたのコードをこれに変更したとき、それはうまくいきました:

    protected override void OnKeyUp(KeyEventArgs e)
    {
        base.OnKeyUp(e);
        if (e.KeyCode == Keys.Oem6)
        {
           Select(4, 9);
        }

    }
于 2009-05-21T13:26:34.413 に答える
0

私はBFreeの回答に投票しましたが、何らかの理由でOnKeyPressメソッドを使用する必要がある場合は、selectメソッドを呼び出すことができるため、イベントの完了後に実行されます。

    protected delegate void SelectAfterKeyPress(int start, int length);

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        base.OnKeyPress(e);
        String keypressed = e.KeyChar.ToString();
        if (keypressed == "}")
        {
            this.BeginInvoke(new SelectAfterKeyPress(Select), new object[] { 4, 9 });
        }
    }
于 2009-05-21T13:37:35.140 に答える
0

Blorgbeardの回答によると、最初にテキストを選択し}てから、テキストボックスに「」と入力して、選択内容を置き換えます。たぶんあなたが望むのは、}最初に「」入力してから選択することです。

protected override void OnKeyPress(KeyPressEventArgs e)
{
   // type "}" into textbox
   base.OnKeyPress(e);

   String keypressed =  e.KeyChar.ToString();

   if(keypressed == "}")
      Select(4,9)        
}
于 2009-05-21T13:45:19.477 に答える