2011-07-09 57 views
1

当文本粘贴到RichTextBox中时,是否有某种方式可以检测或导致事件触发?或者,当文本被粘贴时,可能已经有某种事件触发了?顺便说一下,这是Winforms C#。检测粘贴到RichTextBox中

回答

5

因为不是所有的人都可以使用Ctrl + V,并因为有其他的方式来获取文本到文本框(如拖放),我走了不同的路线,我将在这里分享以防其他人正在寻找解决方案。

我所做的就是在我的课创建一个字段:

int _lastPosition = 0; 

,并在框TextChanged()事件中,我增加了以下内容:

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

我的假设下,去,如果有更多然后2个字符一次输入到文本框中,然后必须粘贴文本,因为一次可以输入多于2个字符的其他方法还能如何?无论如何,这对我有用。感谢所有尝试提供帮助的人。

+0

+1 - 良好的解决方案。 – keyboardP

+0

+1,但为什么检查超过2个字符而不是超过1个字符(即,如果有人不粘贴2个字符,怎么办?)。 –

+0

@StephenSwensen例如一个回车 – pungggi

0

Icemanminds的回答无法正常工作,这会在粘贴时显示,但有副作用。

如果你这样做的话,你还将在文本框中输入if block 012ff1.粘贴至少两行文字 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; 
    } 
+0

我会研究这一点,但我很着迷,你是如何找到这个bug哈哈。 – Icemanind

+0

看到我的帖子编辑,我有点做同样的事情。我必须看到粘贴发生的时间。我刚刚结束粘贴,这样我打破了它...愚蠢的运气? – AnotherUser

+0

此外,我的解决方案如上所述不适用于删除和插入按钮... – AnotherUser

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