0

プロジェクトでQios DevSuiteQTextBoxから呼び出されるコンポーネントを使用しています。

.NET でデフォルトで発生するのと同様に、ユーザーが入力中に+をTextBox押すと、カーソルから残った単語を削除する代わりに、代わりに文字 '' が挿入されます。ControlBackspace

この問題を解決するには、次のようなことをすると思いました

public class QTextBoxEx : QTextBox
{
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == (Keys.Control | Keys.Back))
        {
            // here goes my word removal code
            return true;
        }

        return base.ProcessCmdKey(ref msg, keyData);
    }
}

これは良いアプローチですか、それともこの種の動作を実装するための .NET 組み込みシステムが既にありますか? また、検索文字列から最後の単語を削除する「最もクリーンな」方法は何でしょうか? (私は string.Replace と Regex を今考えることができます)

4

1 に答える 1

2
public class QTextBoxEx : QTextBox
{
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        // shortcut to search bar
        if (keyData == (Keys.Control | Keys.Back))
        {
            // 1st scenario: some text is already selected. 
            // In this case, delete only selected text. 
            if (SelectedText != "")
            {
                int selStart = SelectionStart;
                Text = Text.Substring(0, selStart) + 
                    Text.Substring(selStart + SelectedText.Length);

                SelectionStart = selStart;
                return true;
            }

            // 2nd scenario: delete word. 
            // 2 steps - delete "junk" and delete word.

            // a) delete "junk" - non text/number characters until 
            // one letter/number is found
            for (int i = this.SelectionStart - 1; i >= 0; i--)
            {
                if (char.IsLetterOrDigit(Text, i) == false)
                {
                    Text = Text.Remove(i, 1);
                    SelectionStart = i;
                }
                else
                {
                    break;
                }
            }

            // delete word
            for (int i = this.SelectionStart - 1; i >= 0; i--)
            {
                if (char.IsLetterOrDigit(Text, i))
                {
                    Text = Text.Remove(i, 1);
                    SelectionStart = i;
                }
                else
                {
                    break;
                }
            }
            return true;
        }

        return base.ProcessCmdKey(ref msg, keyData);
    }
}

このコードは、次の 2 つの異なるシナリオを想定しています。

  • 既に選択されているテキスト: 選択したテキストのみを削除します。
  • テキストが選択されていません: 単語が削除されます。
于 2013-11-14T16:31:37.443 に答える