0

我在我的项目中使用QTextBoxQios DevSuite调用的组件。

与 .NET 中默认发生的情况类似TextBox,当用户在键入时按下Control+Backspace时,不是删除光标左侧的单词,而是插入字符 ''。

为了解决这个问题,我想我会做类似的事情

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);
    }
}

这段代码假设了两种不同的场景:

  • 已选择文本:仅删除选定的文本。
  • 没有选定的文本:单词被删除。
于 2013-11-14T16:31:37.443 回答