2011-07-09 83 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 
    } 
}