将粘贴检测到RichTextBox

时间:2011-07-09 18:07:56

标签: c# winforms richtextbox copy-paste

有什么方法可以在文本粘贴到RichTextBox时检测到或导致事件触发?或者也许已经有某种事件在粘贴文本时触发了?顺便说一下,这是Winforms C#。

4 个答案:

答案 0 :(得分:5)

因为并非所有人都可以使用Ctrl + V,并且因为还有其他方法可以将文本放入文本框(例如拖放),所以我采用了不同的路线,我将在此分享以防其他人正在寻找寻求解决方案。

我所做的是在班上创建一个字段:

int _lastPosition = 0;

并在TextChanged()事件中添加了以下内容:

if (SelectionStart - _lastPosition > 2)
{
    // Text was pasted into text box
}
_lastPosition = SelectionStart;

我假设如果一次在文本框中输入超过2个字符,那么必须粘贴文本,因为有人可以一次输入超过2个字符吗?无论如何,这对我有用。感谢所有试图提供帮助的人。

答案 1 :(得分:0)

我无论如何都不是C#专家,事实上我触摸语言已有3年了!但是,您可能希望使用ProcessCmdKey方法来侦听CTRL + V

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=vs.71).aspx

答案 2 :(得分:0)

Icemanminds的答案不能正常运行,这确实会在您粘贴时显示但有副作用。

如果执行此操作,您还将在文本中输入if块,并使用空文本框 1.粘贴至少两行文字 2.用箭头键上到顶行,点击空格然后退格 3.用箭头键返回到底线并按回车键 如果没有发生粘贴,现在会通知您。

编辑:这是问题的解决方法

代码:

    protected override void OnSelectionChanged(EventArgs e)
    {
        base.OnSelectionChanged(e);
        int cavetOffset = SelectionStart - m_nLastCavetPos;
        int sizeOffset = Text.Length - m_nLastKnownSize;
        if (sizeOffset > 0)
        {
            if (sizeOffset == 1)
                Console.WriteLine("Typed \"" + (Text.Substring(SelectionStart - cavetOffset, sizeOffset)) + "\" At Position " + (SelectionStart - cavetOffset));
            else if (sizeOffset > 1)
                Console.WriteLine("Pasted \"" + (Text.Substring(SelectionStart - cavetOffset, sizeOffset)) + "\" At Position " + (SelectionStart - cavetOffset));
        }
        else if (sizeOffset == 0)
        {
            Console.WriteLine("Moved Caret to " + SelectionStart + " From " + m_nLastCavetPos);
        }
        else
        {
            if (sizeOffset == -1)
                Console.WriteLine("Backspaced at " + (SelectionStart - cavetOffset));
            if (sizeOffset < -1)
                Console.WriteLine("HiliteDelete at " + ((SelectionStart - cavetOffset)+-sizeOffset) + " deleted " + (-sizeOffset) + " characters");
        }
        m_nLastKnownSize = Text.Length;
        m_nLastCavetPos = SelectionStart;
    }

答案 3 :(得分:0)

这是另一种类似的方法,用于检测是否发生了更改框中字符数的剪切或粘贴(它不会检测是否粘贴了与突出显示的字符数相同的字符数): 首先创建一个类级别成员来保持当前长度

private int _LastTextLength = 0; 

现在标记用户进入框时的长度:

private void txtNoteDetails_Enter(object sender, EventArgs e)
{
    _LastTextLength = txtNoteDetails.Text.Length;
}

然后使用TextChanged事件:

private void txtNoteDetails_TextChanged(object sender, EventArgs e)
{
    if (Math.Abs(txtNoteDetails.Text.Length - _LastTextLength) > 2)
    {
        //Do your thing
    }
}